定义全局变量

25 浏览
0 Comments

定义全局变量

我只是想知道,在Python 3中,为什么有些全局变量在每个你使用的函数(你自己定义的函数)中都必须被定义为global,而其他的只需要定义一次?可能是因为我还没有完全理解作用域的原因,能否请有经验的人解答一下?

0
0 Comments

全局变量的定义

在一个作用域中,函数/对象可以读取变量的值,但不能修改。如果你想要修改变量的值,你必须将其声明为全局变量。

然而,请注意,“修改值”可能与您从其他编程语言中所习惯的含义不同,因为在Python中赋值的含义是给对象起一个名字。关键字global允许您让给定的名字指向(与之关联)一个不同的对象。看下面的例子:

aa = 1
bb = 2
cc = [1, 2, 3]
def test():
    global aa
    aa = -1
    bb = -1
    cc[2] = -1
test()
print "aa:", aa
print "bb:", bb
print "cc:", cc

将得到以下结果:

aa: -1
bb: 2
cc: [1, 2, -1]

  • 在函数test()中,变量aa被声明为global,所以函数中的aa = -1会将全局的名字aa指向一个新的对象,即整数-1
  • test()中,变量bb没有被声明为全局变量,因此赋值bb = -1会在函数内部创建一个名为bb的局部变量,并将其指向-1,而全局作用域中的bb仍然指向值2
  • 变量cc也没有被声明为全局变量,因此你不能在函数test()中改变全局作用域中cc的关联。然而,由于在全局作用域中cc与一个可变对象关联,你可以在函数内部改变这个对象的内容。

请注意,这里的表述可能不是官方的Python解释方式,但如果你有其他编程语言的背景,这可能有助于理解。请注意,对变量“改变值”的正确解释完全依赖于对“改变变量的值”的正确解释。历史表明,初学者经常对这个部分理解错误。

我同意,所以我认为你上面链接的帖子是一个非常好的澄清细节的起点(关于可变和不可变类型)。

你提到可变和不可变类型好像有区别,这听起来像你也不理解。

抱歉,如果我的表述让人误解。我有这样的经验,来自其他编程语言的人在尝试用他们在其他编程语言中的经验来解释事情时往往难以理解为什么可变和不可变类型的行为不同。我同意,一旦你知道Python的工作原理,它们的行为是一致的。我现在试图在上面更详细地解释这一点。我所说的是它们根本没有不同的行为。

0