Python:全局变量、带“self.”前缀的变量和局部变量有什么区别?
我这些年接触过C/C++/Java这几种语言的语法,但Python中变量的定义方式让我有点困惑。有没有人能说说这三种语言之间的区别?
3 个回答
有时候,回到最基本的原则是非常有用的:
当我们说一个变量是局部的还是全局的,其实是在说它的“作用域”(或者说上下文)。在一个函数内部的变量被认为是局部的。下面是Swaroop的优秀指南《Python一小口》中的例子:
x = 50
def func(x):
print('x is', x)
x = 2
print('Changed local x to', x)
func(x)
print('x is still', x)
输出:
x是50
把局部的x改成了2
x仍然是50
接下来是一个全局变量在函数内外如何变化的例子:
x = 50
def func():
global x
print('x is', x)
x = 2
print('Changed global x to', x)
func()
print('Value of x is', x)
输出:
x是50
把全局的x改成了2
x的值是2
就这么简单。
当我们使用Python的面向对象编程时,‘self’的概念就变得重要了。类的实例被称为“对象”,而‘self.’前缀帮助我们的代码区分是指局部/全局变量,还是对象的属性。
再次强调,这个概念被Swaroop以简单明了的方式解释了。
全局变量就是可以在任何地方都能访问的变量。局部变量则只在当前的范围内可用,比如在一个函数里用的临时变量。实例变量(比如用 self.
前缀的变量)是和某个特定对象实例相关的数据。当然,你也可以在对象外部通过 object.x
来引用实例对象,其中 object
是指向那个对象的引用。
如果一个变量前面有 self
,那么它既不是局部变量也不是全局变量。它是特定对象实例的一部分。简单来说,实例变量代表了特定对象的一个属性。
在下面的例子中, lx
是一个局部变量,只在 greet
方法内部可用。 gx
是一个全局变量,可以在模块的任何地方访问, ix
是一个实例变量,每个对象实例可能有不同的值。当在对象定义内部引用 ix
时,你会用 self
前缀,而在对象外部则用对象引用的前缀。
gx = "hello"
class Foo:
def __init__(self, who):
self.ix = who
def greet(self):
lx = "%s, %s" % (gx, self.ix)
return lx
foo = Foo("world")
print foo.greet()
print foo.ix
self
的用法和 C++ 以及 Java 里的 this
是一样的。它让你可以获取一个对象的引用,然后你可以用 .
操作符来访问这个对象的属性(在 C++ 中是用 ->
)。
在 Python 中,访问实例变量的唯一方式就是通过 self
。实例变量和局部变量或全局变量不在同一个“正常”的作用域里。