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'
如果我在功能测试中不使用全局M,它会发出错误.
你的陈述根本就不是真的!
>>> M = []
>>> s = "abc"
>>>
>>> def test():
... M.append(s)
...
>>> M
[]
>>> test()
>>> M
['abc']
Run Code Online (Sandbox Code Playgroud)
我认为你混淆了两个完全不同的概念:
绑定一个裸名 - 通常是通过赋值(即=),但也可能是通过一些其他语句(def,&c)
调用一个方法(例如append)"可能"碰巧变异对象(只有当该对象是可变的并且该方法当然是一个mutator,但是当对象是一个列表并且方法是这样时,它确实适用append)
我不确定为什么人们可以混淆两个分离的概念,但是,他们肯定可以.也许事实上,一些非普通的"类型"赋值实际上是在"窗帘后面"调用(特殊)方法,例如,赋值给限定名称(a.b=c实际上是调用type(a).__setitem__(a, b),所以,调用方法,而不是重新绑定任何方法) barename)和扩充赋值(a+=b实际上是在做a = type(a).__iadd__(a, b),所以,都调用一个方法并重新绑定一个名字).
global当且仅当你做"1"时,你需要(唉):重新绑定一个裸名(包括通过扩充赋值重新绑定它,但不包括任何其他特殊情况).避免global它,除非它真的是必不可少的(许多人会说它从来不是真正不可或缺的......只是"在某些情况下显然有点方便";-).
| 归档时间: |
|
| 查看次数: |
5141 次 |
| 最近记录: |