这两者有区别吗?

Dan*_*non 2 python arrays memory-management immutability

代码A:

lst = [1, 2, 3]
for i in range(10):
    lst+= ["42"]
Run Code Online (Sandbox Code Playgroud)

代码B:

lst = [1, 2, 3]
for i in range(10):
    lst = lst + ["42"]
Run Code Online (Sandbox Code Playgroud)

我知道输出是一样的,但两个列表的构建方式有什么不同吗?实际上后面发生了什么?

the*_*eye 5

当你这样做

lst += ["42"]
Run Code Online (Sandbox Code Playgroud)

你正在改变lst并在其末尾附加"42".但是,当你说,

lst = lst + ["42"]
Run Code Online (Sandbox Code Playgroud)

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

lst = ["1"]
print(id(lst))
lst += ["2"]
print(id(lst))
lst = lst + ["3"]
print(id(lst))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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