这两者有区别吗?

时间:2013-11-22 09:27:35

标签: python arrays memory-management immutability

代码A:

lst = [1, 2, 3]
for i in range(10):
    lst+= ["42"]

代码B:

lst = [1, 2, 3]
for i in range(10):
    lst = lst + ["42"]

我知道输出是一样的,但两个列表的构建方式是否存在差异? 实际上后面发生了什么?

1 个答案:

答案 0 :(得分:5)

当你这样做时

lst += ["42"]

您正在改变lst并在其末尾追加“42”。但是,当你说,

lst = lst + ["42"]

您正在使用lst"42"创建新列表,并将新列表的引用分配给lst。试试这个程序可以更好地理解这一点。

lst = ["1"]
print(id(lst))
lst += ["2"]
print(id(lst))
lst = lst + ["3"]
print(id(lst))

前两个ID将是相同的,最后一个将是不同的。因为,创建了一个新列表,lst现在指向该新列表。

当你将一个列表作为参数传递给一个函数并将一个项目附加到它时,不知道这两者之间的区别会产生一个问题,就像这样的函数

def mutate(myList):
    myList = myList + ["2"] # WRONG way of doing the mutation
tList = ["1"]
mutate(tList)
print(tList)

你仍会获得['1'],但如果你真的想改变myList,你可以这样做

def mutate(myList):
    myList += ["2"] # Or using append function
tList = ["1"]
mutate(tList)
print(tList)

将打印['1', '2']