以下代码在Python2和中给出了不同的输出Python3:
from sys import version
print(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.0
42
为什么不Python2将函数b内部的变量绑定到execute
函数字符串中的exec
值,而Python3却不这样做呢?如何实现Python2in
的行为Python3?我已经尝试过通过字典让全局变量和本地变量在中exec起作用Python3,但到目前为止没有任何效果。
-编辑-
在阅读Martijns
的答案之后,我用进行了进一步分析Python3。在下面的例子中,我给了locals()
百科作为d
到exec
,但d['b']
打印的东西不仅仅是打印别的b。
from sys import version
print(version)
def execute(a, st):
b = 42
d = locals()
exec("b = {}\nprint('b:', b)".format(st), globals(), d)
print(b) # This prints 42
print(d['b']) # This prints 1000000.0
print(id(d) == id(locals())) # This prints True
a = 1.
execute(a, "1.E6*a")
3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42
1000000.0
True
id
的比较d
和locals()
显示,它们是相同的对象。但在这些条件下b
应与相同d['b']
。我的例子有什么问题?
exec在Python 2和exec()Python 3
之间有很大的不同。你将其exec
视为函数,但这实际上是Python 2中的一条语句。
由于存在这种差异,exec
即使在Python 2中也无法使用来更改Python 3中函数范围内的局部变量。
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语句仅使用()未提供globals
和locals
参数,才locals()
将找到的所有变量显式复制回locals
函数。PyFrame_LocalsToFast
正确的解决方法是为你的exec()呼叫使用新的名称空间(字典):
def execute(a, st):
namespace = {}
exec("b = {}\nprint('b:', b)".format(st), namespace)
print(namespace['b'])
有关此限制的exec()文档非常明确:
Python3 内置函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。 语法 以下是 exec 的语法: exec(object[, globals[, locals]]) 参数 object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被
本文向大家介绍Python3和Python2的区别?相关面试题,主要包含被问及Python3和Python2的区别?时的应答技巧和注意事项,需要的朋友参考一下
本文向大家介绍Python3和Python2中int和long区别相关面试题,主要包含被问及Python3和Python2中int和long区别时的应答技巧和注意事项,需要的朋友参考一下 在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。
本文向大家介绍Python2和Python3中@abstractmethod使用方法,包括了Python2和Python3中@abstractmethod使用方法的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python2和Python3中@abstractmethod使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 抽象方法
本文向大家介绍Python2和Python3的共存和切换使用,包括了Python2和Python3的共存和切换使用的使用技巧和注意事项,需要的朋友参考一下 从python2到python3,这两个版本可以说是从语法、编码等多个方面上都有很大的差别。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容,也就是说许多针对早期Python2版本设计的程式都无法在Python 3上正
本文向大家介绍Python2和Python3中print的用法示例总结,包括了Python2和Python3中print的用法示例总结的使用技巧和注意事项,需要的朋友参考一下 前言 最近在学习python,对于python的print一直很恼火,老是不按照预期输出。在python2中print是一种输出语句,和if语句,while语句一样的东西,在python3中为了填补python2的各种坑,将