2014-03-30 5 views
2

Так что я получил некоторый код, похожий на этот (этот код воспроизводит мой вопрос, даже если он ничего полезного не делает):имя Python затенения путаница

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 «Название теней f из внешнего пространства». Это связано с тем, что переменная повторно используется при вызове enumerate() в следующей строке.

Код работает, как ожидалось, но что здесь происходит? Правильно ли я полагаю, что Python решает, что f является локальной переменной в fn и предупреждает меня, что использование f внутри лямбда не будет таким же f, определяемым локально, даже если лямбда использует имя переменной f сначала?

Помимо переименования переменных, существует ли наилучшая практика для избежания этого - или я должен просто использовать свое мнение и игнорировать предупреждение в этом случае?

+0

Если это имеет значение, это в Python 2.7. – Floomi

+1

Просто используйте 'print map (len, l)'. – Ryan

+1

Это пример игрушки, иллюстрирующий язык, а не производственный код. – Floomi

ответ

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. Предупреждение должно сообщить вам, что аргумент lambdaf имеет приоритет над значением f в fn, когда приходит время оценить len(f).

+0

sorta-kinda like [javascript hoisting] (https://www.w3schools.com/js/js_hoisting.asp), за исключением того, что у Python нет объявлений, кроме этого это значит, что это ... – dwanderson

Смежные вопросы