exec - python 3 exec() globals() 和 locals()
问题描述
我在不同的环境中对同一个脚本进行了四次调用,只有前三个成功了。系统将失败的原因提供为“Fibnacci() not found.”,但在前三个调用中也没有找到。因此,为什么前三个调用成功是很令人困惑的?
def isFun():
#testFibtest2.py
with open('testFib.py') as f:
exec('print(dir())',globals())
exec('print(dir())',{})
exec('print(dir())')
exec('print(dir())',{},{})
code = compile(f.read(), 'testFib.py', 'exec')
exec('print(dir())',globals())
exec('print(dir())',{})
exec('print(dir())')
exec('print(dir())',{},{})
exec(code,globals())
exec(code,{})
exec(code)
exec(code,{},{})
isFun()
和
def Fibonacci(n):
#testFib.py
if n<0:
print("Incorrect input")
# First Fibonacci number is 0
elif n==1:
return 0
# Second Fibonacci number is 1
elif n==2:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
# Driver Program
print(Fibonacci(9))
和输出:
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'isFun']
['__builtins__']
['f']
[]
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'isFun']
['__builtins__']
['code', 'f']
[]
21
21
21
Traceback (most recent call last):
File "testFibtest2.py", line 20, in <module>
isFun()
File "testFibtest2.py", line 19, in isFun
exec(code,{},{})
File "testFib.py", line 17, in <module>
print(Fibonacci(9))
File "testFib.py", line 13, in Fibonacci
return Fibonacci(n-1)+Fibonacci(n-2)
NameError: name 'Fibonacci' is not defined
解决方案
根据 Python 3 文档,在第 4 次调用中,由于全局变量和局部变量都传递给 exec(),因此代码就像在类中一样执行。那么 Fibonacci 是该类中的一个方法,因此不能将其称为 Fibonacci()。事实上,没有办法创建“类”的实例,我们无法正确调用它。
推荐阅读
- python-3.x - 检查字典是否存在,然后只定义它
- python - cs50金融中无法使索引功能工作
- regex - Laravel Valet nginx 位置正则表达式在 Mac Catalina 上不起作用
- ruby-on-rails - 错误:对于 SELECT DISTINCT,ORDER BY 表达式必须使用 order by 和 uniq 出现在选择列表中
- azure - 如何为昨天的记录指定查询 Azure 数据工厂源(Azure 表存储)
- javascript - 如何使用 Firebase 实时数据库将信息从一个用户发送到另一个用户?
- python - 为什么我的函数会改变我的输入数据?
- java - 如何在strings.xml中使用href
- google-kubernetes-engine - pods 容器 (podsgke) 和 CPU 使用率
- c# - 在变量中有一个 Json 数据,并希望在 asp.net 中以表格形式显示该数据