为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2019-07-05 15:45:11
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.0Python3指纹: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?我已经试着把全球和当地人的字典exec在Python3但到目前为止什么都没起作用。
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

两者之间有很大的区别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_FASTLOAD_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()退货。


查看完整回答
反对 回复 2019-07-05
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

我想说是一只蟒蛇的虫子。

def u():
    exec("a=2")
    print(locals()['a'])u()

印“2”。

def u():
    exec("a=2")
    a=2
    print(a)u()

印“2”。

def u():
    exec("a=2")
    print(locals()['a'])
    a=2u()

失败

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in uKeyError: 'a'

-编辑-另一个有趣的行为:

def u():
    a=1
    l=locals()
    exec("a=2")
    print(l)u()def u():
    a=1
    l=locals()
    exec("a=2")
    locals()
    print(l)u()

产出

{'l': {...}, 'a': 2}{'l': {...}, 'a': 1}

还有

def u():
    l=locals()
    exec("a=2")
    print(l)
    print(locals())u()def u():
    l=locals()
    exec("a=2")
    print(l)
    print(locals())
    a=1u()

产出

{'l': {...}, 'a': 2}{'l': {...}, 'a': 2}{'l': {...}, 'a': 2}{'l': {...}}

显然,exec关于当地人的情况如下:

  • 如果在

    exec

    这个变量是一个局部变量,然后

    exec

    修改内部字典(由

    locals()

    ),并且不将其返回到原来的状态。打电话给

    locals()

    更新字典(如python文档第2节所述),以及

    exec

    被遗忘了。打电话的需要

    locals()

    更新字典并不是python 3的一个bug,因为它是文档化的,但它不是直观的。而且事实上

    exec

    不改变函数的局部变量是与python 2有记录的区别(文档中说“如果您需要在函数exec()返回后看到代码对局部变量的影响,请传递一个显式的局部变量字典”),我更喜欢python 2的行为。
  • 如果在

    exec

    而这个变量在此之前并不存在

    exec

    修改内部字典,除非之后设置变量。好像路上有个虫子

    locals()

    更新字典;此错误允许访问

    exec

    打电话

    locals()

    exec.


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 1835 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信