代码结果不明白,求高人讲解
本帖最后由 hanzhaoshuai 于 2012-11-29 10:46:15 编辑
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
运行结果:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
小弟新手,求讲解代码的执行次序,为什么第三个会是nonlocal.
[解决办法]
do_nonlocal()这个函数里你用了一个关键字: nonlocal
这个关键之的功能和global的效果差不多,它告诉解释器它后面的标量是一个全局的,不是本地的
所以解释器会在当前运行环境之上一层里寻找 spam 这个变量,如果找不到就继续向上寻找
所以它找的的是 spam = "test spam" 这里定义的spam
你把此处的变量修改为 nonlocal spam 出现了当前的结果。。
明白?
[解决办法]
很简单啊, 不管是什么, 查找都是向上一直找的, 但函数只能读嵌套的变量而不能改, 但加上nonlocal就可以改嵌套中的变量了,并且其嵌套环境中的变量值被保留, 你把nonlocal函数在最后返回, 在全局调用一次你还会见识到新东西。
global就是明确要读写全局变量。
[解决办法]
不要想覆盖这种事, 要想作用域链和自下而上查找这两个原则。