定义全局变量
全局变量的定义
在一个作用域中,函数/对象可以读取变量的值,但不能修改。如果你想要修改变量的值,你必须将其声明为全局变量。
然而,请注意,“修改值”可能与您从其他编程语言中所习惯的含义不同,因为在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的工作原理,它们的行为是一致的。我现在试图在上面更详细地解释这一点。我所说的是它们根本没有不同的行为。