为什么我不能将List Comprehensions分配给它里面的列表对象?(Python)

时间:2013-12-27 03:40:59

标签: python list

在我写下以下代码后:

if isinstance(lst, (list, tuple)) and len(lst) > 0:
    lst = [v.lower() for v in lst]
    pv_on, uv_on = 'pv'in lst, 'uv' in lst

PyCharm中的输出错误:NameError: name 'lst' is not defined

但如果我在lst2内使用[v.lower() for v in lst]而不是'lst',如下所示,它运作正常。我只是想知道原因。

if isinstance(lst, (list, tuple)) and len(lst) > 0:
    lst2 = [v.lower() for v in lst]
    pv_on, uv_on = 'pv'in lst2, 'uv' in lst2

更新
也许是装饰师造成的, 测试代码:

lst = ['A', 'B', 'C']
def record_deco(lst):
    def _wrapper(func):
        def wrapper(*args,**kwargs):

            if isinstance(lst, (list, tuple)) and len(lst) > 0:
                lst = [v.lower() for v in lst]
                a_on, b_on = 'a' in lst, 'b' in lst
                print a_on
                print b_on
            return func(*args, **kwargs)
        return wrapper
    return _wrapper

@record_deco(['a'])
def a(x):
    print x


a('xxx')

这次我使用sublime,输出错误是:UnboundLocalError: local variable 'lst' referenced before assignmentlst更改为lst2后,此错误消失。

2 个答案:

答案 0 :(得分:2)

lst = ['A', 'B', 'C']
lst = [v.lower() for v in lst]
a_on, b_on = 'a' in lst, 'b' in lst
a_on, b_on
(True, True)

适合我。令人费解。

答案 1 :(得分:2)

如果在函数中的任何位置分配变量,Python会将函数中该变量的所有使用视为局部变量。由于您在lst中分配了wrapper,因此它被视为wrapper的本地。这意味着当您执行lst = [v.lower() for v in lst]时,本地变量lst已经存在,因此可以迭代。但是不存在 local 变量lst,因此会引发错误。您可以通过搜索Stackoverflow for UnboundLocalError找到许多其他问题。

正如您已经发现的那样,解决方案是为内部变量使用不同的名称。 (在Python 3中,您可以使用nonlocal lstlst标记为从封闭的record_deco函数中使用,但由于您不使用{{1除了嵌套函数之外。)