首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

代码结果不明白,求圣人讲解

2012-12-29 
代码结果不明白,求高人讲解本帖最后由 hanzhaoshuai 于 2012-11-29 10:46:15 编辑def scope_test():def do

代码结果不明白,求高人讲解
本帖最后由 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就是明确要读写全局变量。
[解决办法]
不要想覆盖这种事, 要想作用域链和自下而上查找这两个原则。

热点排行