用+ =混淆简单的python列表行为

时间:2014-01-03 05:05:33

标签: python

list4=[7,8]
def proc3(mylist):
    mylist+=[9]


print list4
proc3(list4)
print list4

为什么这段代码会产生答案[7,8]和[7,8,9]?我期待[7,8]和[7,8]。 不是mylist + = [9]连接数字9并仅创建一个新的列表作为局部变量?为什么运行proc3(list4)之后的“print list4”,但在程序之外,不会导致原始列表?我必须在这里遗漏一些明显的东西。在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

+= 会返回新的列表对象。相反,它会就地修改原始列表对象。

换句话说,proc3内的这一行:

mylist+=[9]

正在修改mylist引用的列表对象。因此,它不再是[7, 8]而是[7, 8, 9]

答案 1 :(得分:1)

在另一篇文章中引用this answer

  

一切都是Python的参考。如果您希望避免这种行为,则必须使用list()创建原始文件的新副本。如果列表包含更多引用,则需要使用deepcopy()

让我们:

list4 = [7, 8]
def proc3(mylist):
    print id(list4)
    mylist += [9]
    print id(list4)


print list4
print id(list4)
proc3(list4)
print id(list4)
print list4

这将打印:

[7, 8]
36533384
36533384
36533384
36533384
[7, 8, 9]

正如您所看到的,它在每个时刻都是相同的列表。

答案 2 :(得分:0)

+=运算符会修改对象。注意

x += y

有很大不同
x = x + y

(请查看您的测试代码)