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语句,除非你有充分的理由使用它们。有更好的方法来实现您在这里所做的事情,而不必求助于评估。请缩进您的代码查看公认的答案-非常好的解释。