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,执行特定于赋值类型的二进制操作 ,并将结果分配给原始目标。