|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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)
运行结果为:
请问为什么最后两个输出不是:global spam,个人觉得感觉倒数第二个输出也应该是global spam
这是我在遇到你这个问题的时候,自己做的笔记和个人想法,不知道能不能给你提供一点看法。
def scope_test():
def do_local():
spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外部函数的spam是两个变量。
def do_nonlocal():
nonlocal spam #使用外部函数的spam局部变量,即 spam 先赋值 'test spam'再赋值为'nonlocal spam',并且作用在整个外部函数的作用域内。
spam = "nonlocal spam"
def do_global():
global spam #此处定义全局变量spam,全局变量里没有spam,所以直接就将spam = 'golbal spam'定义为全局变量了。
spam = "global spam"
spam = "test spam" #此处的spam是外部函数的局部变量,并非全局变量。
do_local()
print("After local assignmane:", spam)
do_nonlocal()
print("After nonlocal assignment:",spam)
do_global()
print("After global assignment:",spam)
### 特别注意的是,这里输出函数的顺序,尤其'nonlocal spam'命令的函数顺序是在第二,所以第一个函数不受影响,而第三个函数是在执行了第二个函数后执行,所以spam已经被nonlocal了,成了'nonlocal spam'。
scope_test()
print("In global scope:",spam)
输出结果是:
After local assignmane: test spam
#因为直接在内嵌函数内赋值spam只是复制一个在该内嵌函数内使用的spam,不会影响外部函数的spam,所以输出test spam。
After nonlocal assignment: nonlocal spam
#因为执行了'nonlocal spam'命令,所以scope_test()函数这个作用域内的spam已经重新赋值为nonlocal spam,所以输出nonlocal spam。
After global assignment: nonlocal spam
#因为第二步执行了nonlocal,所以这个作用域的spam已经是nonlocal spam, 所以这里也输出nonlocal spam。(注:如果把最后二三的函数调用和print内容调换,do_global()的print会输出test spam而不是nonlocal spam。)
In global scope: global spam
#函数外本来没有spam赋值,所以直接输出spam是报错的,但是执行了以上scope_test函数后,里面的global spam命令就给本来不存在的全局变量spam赋值了,所以现在就可以输出了。
|
|