python-3.x - 在 python 的函数中使用 exec() 时出错的原因
问题描述
如果我编写如下代码:
lists = ["a='1'", "b='2'", "c=a+b"]
returned_list = []
for x in lists:
exec(x)
print(c)
它有效,并打印“12”。但是,如果我在函数中使用 exec():
lists = ["a='1'", "b='2'", "c=a+b"]
def test(lst):
for x in lists:
exec(x)
print(c)
test(lists)
它返回NameError: name 'c' is not defined
。如何在函数中使用 exec()?
解决方案
当您在函数中分配一个新变量时,您实际上是在一个范围内分配了一个变量,该范围将在函数关闭后关闭。把它想象成一个气泡,里面有一个物品,在泡沫破灭后,物品也随之消失并消失。这意味着,在函数中使用 exec()会创建一个临时局部变量。但是由于函数具有预定义的代码,因此不可能在不直接更改代码的情况下向它们添加新变量。在这种情况下,我们需要对 exec 中的每个新变量使用global关键字,以使变量保存在main而不是函数中。因此,您的列表将如下所示:
lists = ["global a\na='1'"]
我也不太确定你是否喜欢a+b的输出为12,如果不喜欢,你可以删除每个数字周围的单引号,例如"a=1"
使它们成为整数
推荐阅读
- laravel - Laravel 从数据库中获取路由
- c# - C# 移动文件并重命名它,如果它已经存在
- c++ - OpenCV - 回放 CPU 使用率
- python - 打印带有 UTF-8 编码字符的字符串,例如:“\u00c5\u009b\”
- docker - Openshift:从自己的注册表中提取 Docker 映像的 TLS 错误
- hadoop - 发生此类错误时该怎么办?
- telegram - Telegram BOT API:如何更改照片(不是标题)
- iphone - 在 Swift 中获取 iPhone 日期和时间设置
- swift - 将 pod 更新到 Firebase 5.4 后的 Firebase 错误
- c# - 将正整数添加到 int 会导致它变为负数