ube*_*kel 24 python exec locals python-3.x
我以为这会打印3,但它打印1:
def f():
a = 1
exec("a = 3")
print(a)
Run Code Online (Sandbox Code Playgroud)
Mar*_*off 41
在Python3错误列表中对此问题进行了一些讨论.最终,要获得此行为,您需要执行以下操作:
def foo():
ldict = {}
exec("a=3",globals(),ldict)
a = ldict['a']
print(a)
Run Code Online (Sandbox Code Playgroud)
如果您查看Python3文档exec
,您将看到以下注释:
默认的locals如
locals()
下面的函数所述:不应尝试修改默认的locals字典.如果您需要在函数exec()返回后查看代码对locals的影响,则传递显式的locals字典.
回到关于错误报告的特定消息,Georg Brandl说:
如果没有几个结果,则无法动态修改函数的局部函数:通常,函数局部函数不存储在字典中,而是存储在数组中,其索引在编译时从已知语言环境确定.这至少与exec添加的新本地人发生冲突.旧的exec语句规避了这一点,因为编译器知道如果函数中没有发生全局/局部因子的exec,那么该命名空间将"未经优化",即不使用本地数组.由于exec()现在是一个普通函数,编译器不知道"exec"可能绑定到什么,因此无法特别处理.
重点是我的.
所以,它的要点是,Python3可以更好地优化使用局部变量不会允许在默认情况下此行为.
为了完整起见,正如上面的评论中所提到的,这在Python 2.X中可以正常工作:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
... a = 1
... exec "a=3"
... print a
...
>>> f()
3
Run Code Online (Sandbox Code Playgroud)
如果您在方法内部,您可以这样做:
# python 2 or 3
class Thing():
def __init__(self):
exec('self.foo = 2')
x = Thing()
print(x.foo)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9049 次 |
最近记录: |