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)
我知道输出是一样的,但两个列表的构建方式有什么不同吗?实际上后面发生了什么?
当你这样做
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']