如果我在列表中使用 +=,为什么在赋值之前引用局部变量,但扩展效果很好


def test():
    a = [1,2,3]
    def test2():
        a += [4,5]
    test2()
    print a
test()

在我看来,a += [4,5]相当于a.extend cus它是就地的 连接两个列表 - "+="和 extend() 之间的区别

但是,使用 += 会触发错误,但extend工作正常。

我错了吗?

更新

我相信我找到了原因。

operator.iadd(a, [4,5])工作正常。

所以我相信内部a+=[4,5]被解释为a = operator.iadd(a, [4,5]),任务来了。

test2中存在对a的赋值(如a += [4,5])会导致Python创建一个a test2变量,该变量永远不会被初始化。在 Python 3 中,你可以在 test2 中声明nonlocal a来解决这个问题。在 Python 2 中,您必须使用extend或解决方法,将a放入 1 元素列表中并使用

a[0] += [4, 5]
根据为什么

当变量有值时我会收到一个 UnboundLocalError?:

这是因为当您对作用域中的变量进行赋值时, 该变量成为该范围的局部变量,并隐藏任何类似的变量 外部作用域中的命名变量。自从 foo 中的最后声明以来 为 X 分配一个新值,编译器将其识别为本地值 变量。

根据增强赋值语句:

增强分配评估目标(与正常分配不同 赋值语句,不能是解包)和表达式 list,执行特定于赋值类型的二进制操作 ,并将结果分配给原始目标。

相关内容

最新更新