Python 封闭函数范围搜索?

Python 封闭函数范围搜索?,python,function,Python,Function,我是编程新手,略读了一些函数和类的主题。 因此,在阅读了函数和封闭函数之后,我试图通过只对函数及其作用域进行微操作来模拟类中的继承搜索 例如: 对于代码 def f1(): t=1 def f2(x): return eval(x) return f2 为什么执行此操作时会出现名称错误 f1() 但不是在你说什么的时候 def f1(): t=1 def f2(): return t return f2 f()

我是编程新手,略读了一些函数和类的主题。 因此,在阅读了函数和封闭函数之后,我试图通过只对函数及其作用域进行微操作来模拟类中的继承搜索

例如:

对于代码

def f1():
    t=1
    def f2(x):
        return eval(x)
    return f2
为什么执行此操作时会出现名称错误

f1()

但不是在你说什么的时候

def f1():
    t=1
    def f2():
         return t
    return f2
f()()#1在此处返回


我可以通过在f2范围内将t定义为非局部来解决这个问题,这意味着第一个代码只在f2的局部范围内查看。为什么会发生这种情况`

这里的问题是我们的背景。默认情况下,eval使用调用它的环境中的局部变量和全局变量。如果我们写:

def f1():
    t = 1

    def f2(x):
        return eval(x)
    return f2
然后在
f2
中,
t
不包含在全局或局部中,因此eval语句无法访问。如果在
f2
中实际使用了
t
,Python只会将
t
添加到
f2
的局部变量中。因此,令人有些意外的是,以下代码将正确执行:

def f1():
    t = 1

    def f2(x):
        print(t)
        return eval(x)
    return f2
由于
t
现在在
f2
中使用。确保这一点始终有效的更好方法是执行以下操作:

def f1():
    t = 1
    eval_globals = globals()
    eval_locals = locals()

    def f2(x):
        return eval(x, eval_globals, eval_locals)
    return f2
这将覆盖eval的上下文,提供
f1
范围内的全局和局部变量


一个警告,因为你提到你是一个新的程序员:一般来说,你应该避免eval语句,除非你有充分的理由使用它们。有更好的方法来实现您在这里所做的事情,而不必求助于评估。

请缩进您的代码查看公认的答案-非常好的解释。