Python 2和Python 3中EXEC函数的行为

Python 2和Python 3中EXEC函数的行为

下面的代码给出了不同的输出Python2和在Python3:

from sys import versionprint(version)def execute(a, st):
    b = 42
    exec("b = {}\nprint('b:', b)".format(st))
    print(b)a = 1.execute(a, "1.E6*a")

Python2指纹:

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]('b:', 1000000.0)1000000.0

Python3指纹:

3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]b: 1000000.042

为什么Python2绑定变量b内部execute函数的字符串中的值。exec功能,同时Python3不是这样的吗?我怎样才能达到Python2在……里面Python3?我已经试着把全球和当地人的字典execPython3但到目前为止什么都没起作用。


慕标5832272
浏览 1836回答 3
3回答

凤凰求蛊

两者之间有很大的区别exec在Python 2和exec()在Python 3中。exec作为一种功能,但它确实是一个陈述在Python 2中。由于这种差异,您不能在Python 3中更改函数作用域中的局部变量。exec即使在Python 2中也是可能的,甚至以前都没有声明过的变量。locals()只在一个方向上反映局部变量。以下内容在2或3中都不起作用:def foo():     a = 'spam'     locals()['a'] = 'ham'     print(a)              # prints 'spam'在Python 2中,使用exec语句意味着编译器知道要关闭本地范围优化(从LOAD_FAST到LOAD_NAME例如,查找本地和全局范围中的变量)。带着exec()作为一个函数,该选项不再可用,而函数作用域现在是可用的。总优化。此外,在Python 2中,exec语句显式复制在locals()返回到函数局部变量,使用PyFrame_LocalsToFast,但前提是没有全球和本地人提供了参数。正确的解决方法是为您的用户使用一个新的命名空间(字典)。exec()呼叫:def execute(a, st):     namespace = {}     exec("b = {}\nprint('b:', b)".format(st), namespace)     print(namespace['b'])这个exec()文献资料对于这个限制是非常明确的:注:默认本地人按所述的功能行事locals()下面:对默认值的修改本地人不应尝试使用字典。传递显式本地人如果需要查看代码在函数后对局部变量的影响,请使用字典。exec()退货。

翻翻过去那场雪

我想说是一只蟒蛇的虫子。def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;print(locals()['a'])u()印“2”。def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;a=2 &nbsp;&nbsp;&nbsp;&nbsp;print(a)u()印“2”。但def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;print(locals()['a']) &nbsp;&nbsp;&nbsp;&nbsp;a=2u()失败Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module> &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;3,&nbsp;in&nbsp;uKeyError:&nbsp;'a'-编辑-另一个有趣的行为:def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;a=1 &nbsp;&nbsp;&nbsp;&nbsp;l=locals() &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;print(l)u()def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;a=1 &nbsp;&nbsp;&nbsp;&nbsp;l=locals() &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;locals() &nbsp;&nbsp;&nbsp;&nbsp;print(l)u()产出{'l':&nbsp;{...},&nbsp;'a':&nbsp;2}{'l':&nbsp;{...},&nbsp;'a':&nbsp;1}还有def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;l=locals() &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;print(l) &nbsp;&nbsp;&nbsp;&nbsp;print(locals())u()def&nbsp;u(): &nbsp;&nbsp;&nbsp;&nbsp;l=locals() &nbsp;&nbsp;&nbsp;&nbsp;exec("a=2") &nbsp;&nbsp;&nbsp;&nbsp;print(l) &nbsp;&nbsp;&nbsp;&nbsp;print(locals()) &nbsp;&nbsp;&nbsp;&nbsp;a=1u()产出{'l':&nbsp;{...},&nbsp;'a':&nbsp;2}{'l':&nbsp;{...},&nbsp;'a':&nbsp;2}{'l':&nbsp;{...},&nbsp;'a':&nbsp;2}{'l':&nbsp;{...}}显然,exec关于当地人的情况如下:如果在exec这个变量是一个局部变量,然后exec修改内部字典(由locals()),并且不将其返回到原来的状态。打电话给locals()更新字典(如python文档第2节所述),以及exec被遗忘了。打电话的需要locals()更新字典并不是python 3的一个bug,因为它是文档化的,但它不是直观的。而且事实上exec不改变函数的局部变量是与python 2有记录的区别(文档中说“如果您需要在函数exec()返回后看到代码对局部变量的影响,请传递一个显式的局部变量字典”),我更喜欢python 2的行为。如果在exec而这个变量在此之前并不存在exec修改内部字典,除非之后设置变量。好像路上有个虫子locals()更新字典;此错误允许访问exec打电话locals()后exec.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python