python string是默认的全局

chn*_*net 1 python string scope global

我对Python中的全局变量有疑问.代码如下.如果我在功能测试中不使用全局M,它会发出错误.但为什么它不显示字符串s的错误.我并未将其声明为全球性的.

global M
M = []
s = "abc"

def test():
    ### global M
    print M 
    M.append(s)
Run Code Online (Sandbox Code Playgroud)

print M UnboundLocalError:赋值前引用的局部变量'M'

Ale*_*lli 6

如果我在功能测试中不使用全局M,它会发出错误.

你的陈述根本就不是真的!

>>> M = []
>>> s = "abc"
>>> 
>>> def test():
...     M.append(s)
... 
>>> M
[]
>>> test()
>>> M
['abc']
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 调用一个方法(例如append)"可能"碰巧变异对象(只有当该对象是可变的并且该方法当然是一个mutator,但是当对象是一个列表并且方法是这样时,它确实适用append)

我不确定为什么人们可以混淆两个分离的概念,但是,他们肯定可以.也许事实上,一些非普通的"类型"赋值实际上是在"窗帘后面"调用(特殊)方法,例如,赋值给限定名称(a.b=c实际上是调用type(a).__setitem__(a, b),所以,调用方法,而不是重新绑定任何方法) barename)和扩充赋值(a+=b实际上是在做a = type(a).__iadd__(a, b),所以,调用一个方法重新绑定一个名字).

global当且仅当你做"1"时,你需要(唉):重新绑定一个裸名(包括通过扩充赋值重新绑定它,但包括任何其他特殊情况).避免global它,除非它真的是必不可少的(许多人会说它从来不是真正不可或缺的......只是"在某些情况下显然有点方便";-).

  • @chnet请将错误信息复制到您的问题中,而不是仅仅谈论它.你正在强迫人们阅读你的思想,这种思想并不奏效. (2认同)