exec 语句对 locals() 结果的影响有点不解, 请教一下!

2017-10-02 15:55:02 +08:00
 noobsheldon
x = 30
def out():
    x = 50
    def inner():
        print x
        print locals()
    return inner
out()()    # 此处 print locals()  结果 {'x': 50}

============另一个 Python shell 中

x =30
def out():
    x = 50
    def inner():
        print x
        print locals()
        exec 'print x' in globals(), locals()
    return inner
out()()    # 此处 print locals()  结果 {}
1491 次点击
所在节点    Python
2 条回复
daya0576
2017-10-10 17:35:55 +08:00
exec 'print x' in locals(), globals()

这句话的意思是:
把 locals()返回的字典, 当做'print x'的全局域(global scope)
把 globals()返回的字典, 作为要执行的'print x'的 local scope

所以 exec 'print x' in globals(), locals() 就相当于 print globals()['x']
打印出的是 30

那么问题来了, 为什么`print locals()`是个空字典呢?
感觉是因为编译的时候?? local scope 被拿去占用了, 原来的被新生成的替代了.
执行完 exec 'print x' in globals(), locals()后, x 也消失了.


不知道楼主有没有什么新发现??
noobsheldon
2017-10-10 18:14:13 +08:00
@daya0576
x = 30
exec_local = {'x': 100}
def out():
x = 50
def inner():
print x
print locals()
exec 'print x' in globals(), exec_local
print exec_local
print x
return inner

out()() #===>

50
{}
100
{'x': 100}
50

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/395159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX