Python:全局变量、带“self.”前缀的变量和局部变量有什么区别?

2 投票
3 回答
10026 浏览
提问于 2025-04-17 09:03

我这些年接触过C/C++/Java这几种语言的语法,但Python中变量的定义方式让我有点困惑。有没有人能说说这三种语言之间的区别?

3 个回答

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以简单明了的方式解释了。

7

全局变量就是可以在任何地方都能访问的变量。局部变量则只在当前的范围内可用,比如在一个函数里用的临时变量。实例变量(比如用 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
3

self 的用法和 C++ 以及 Java 里的 this 是一样的。它让你可以获取一个对象的引用,然后你可以用 . 操作符来访问这个对象的属性(在 C++ 中是用 ->)。

在 Python 中,访问实例变量的唯一方式就是通过 self。实例变量和局部变量或全局变量不在同一个“正常”的作用域里。

撰写回答