Python名称阴影混乱

时间:2014-03-30 01:49:14

标签: python scope

所以我有一些类似的代码(这段代码再现了我的问题,即使它没有做任何有用的事情):

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正在决定ffn中的局部变量并且警告我在lambda中使用f并不相同f在本地定义 - 即使lambda首先使用变量名f

除了重命名变量之外,是否有避免这种情况的最佳做法 - 或者我应该只使用我的判断而忽略此例中的警告?

1 个答案:

答案 0 :(得分:1)

在函数定义中的任何位置分配变量使其成为函数的本地变量。一个更典型的例子是

x = 3
def foo():
    print x
    x = 2
foo()

定义foo后,x = 2没有先前的global x语句,x成为本地变量。调用foo时,调用x时尚未定义局部变量print x,从而产生UnboundLocalError。有一个同名的全局变量并不重要。

在您的示例中,for循环是对变量f的一种隐式赋值,因此ffn的本地。警告是在评估lambda时,f参数f优先于fn len(f)的值。< / p>