所以我有一些类似的代码(这段代码再现了我的问题,即使它没有做任何有用的事情):
def fn():
l = ["foo", "bar", "baz"]
print map( lambda f : len(f), l )
for i, f in enumerate(l):
print i, f
PyCharm正在报告我的lambda f
" Shadows名称f来自外部范围"。这似乎是因为变量在以下行的enumerate()
调用中被重用。
代码按预期工作,但这里发生了什么?我是否认为Python正在决定f
是fn
中的局部变量并且警告我在lambda中使用f
并不相同f
在本地定义 - 即使lambda首先使用变量名f
?
除了重命名变量之外,是否有避免这种情况的最佳做法 - 或者我应该只使用我的判断而忽略此例中的警告?
答案 0 :(得分:1)
在函数定义中的任何位置分配变量使其成为函数的本地变量。一个更典型的例子是
x = 3
def foo():
print x
x = 2
foo()
定义foo
后,x = 2
没有先前的global x
语句,x
成为本地变量。调用foo
时,调用x
时尚未定义局部变量print x
,从而产生UnboundLocalError
。有一个同名的全局变量并不重要。
在您的示例中,for
循环是对变量f
的一种隐式赋值,因此f
是fn
的本地。警告是在评估lambda
时,f
参数f
优先于fn
len(f)
的值。< / p>