我有一个关于 Python 中的全局变量的问题。 代码如下。如果我在功能测试中不使用全局 M, 它会发出错误。 但是为什么它不显示字符串 s 的错误。我没有宣布它是全局性的。
global M
M = []
s = "abc"
def test():
### global M
print M
M.append(s)
打印M UnboundLocalError:赋值前引用了局部变量“M”
最佳答案
If I do not use global M in function test, It would issue error.
你的这个说法根本不是真的!!!
>>> M = []
>>> s = "abc"
>>>
>>> def test():
... M.append(s)
...
>>> M
[]
>>> test()
>>> M
['abc']
我认为您混淆了两个完全不同的概念:
绑定(bind)裸名——通常通过赋值(即
=
),但也可能 通过一些其他语句 (def
, &c)调用方法(例如
append
)“可能”碰巧改变对象 (仅当该对象是可变的并且该方法当然是一个变元时,但是 当对象是一个列表并且方法是append
) 时确实适用
我不确定为什么人们会混淆这两个截然不同的概念,但他们肯定会。也许是一些非普通的“类型”的赋值实际上是在“幕后”调用一个(特殊的)方法,例如,分配给限定名称(a.b=c
实际上是在调用type(a).__setitem__(a, b)
,因此,调用方法,不重新绑定(bind)任何裸名)和扩充赋值(a+=b
实际上是在做 a = type(a).__iadd__(a, b)
,所以,两者 调用方法和 重新绑定(bind)裸名)。
当且仅当您执行“1”时,您才需要 global
(唉):重新绑定(bind)一个裸名(包括通过增强分配重新绑定(bind)它,但不包括任何其他特例)。避免 global
,除非它真的不可或缺(许多人会说它永远真正不可或缺...在某些情况下只是“显然有点方便”;-)。
关于python 字符串默认是全局的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840349/