Skip to main content
 首页 » 编程设计

python 字符串默认是全局的

2025年05月04日20soundcode

我有一个关于 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'] 

我认为您混淆了两个完全不同的概念:

  1. 绑定(bind)裸名——通常通过赋值(即=),但也可能 通过一些其他语句 (def, &c)

  2. 调用方法(例如append)“可能”碰巧改变对象 (仅当该对象是可变的并且该方法当然是一个变元时,但是 当对象是一个列表并且方法是 append)

  3. 时确实适用

我不确定为什么人们会混淆这两个截然不同的概念,但他们肯定会。也许是一些非普通的“类型”的赋值实际上是在“幕后”调用一个(特殊的)方法,例如,分配给限定名称(a.b=c 实际上是在调用type(a).__setitem__(a, b),因此,调用方法,不重新绑定(bind)任何裸名)和扩充赋值(a+=b 实际上是在做 a = type(a).__iadd__(a, b),所以,两者 调用方法和 重新绑定(bind)裸名)。

当且仅当您执行“1”时,您才需要 global(唉):重新绑定(bind)一个裸名(包括通过增强分配重新绑定(bind)它,但不包括任何其他特例)。避免 global,除非它真的不可或缺(许多人会说它永远真正不可或缺...在某些情况下只是“显然有点方便”;-)。