首页 > 解决方案 > 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

标签: execpython-3.6

解决方案


根据 Python 3 文档,在第 4 次调用中,由于全局变量和局部变量都传递给 exec(),因此代码就像在类中一样执行。那么 Fibonacci 是该类中的一个方法,因此不能将其称为 Fibonacci()。事实上,没有办法创建“类”的实例,我们无法正确调用它。


推荐阅读