此代码如何工作?它会创建一个新列表,而不影响代码中的原始列表吗?
def changeit(lst):
lst[0] = "Michigan"
lst[1] = "Wolverines"
return lst
mylst = ['106', 'students', 'are', 'awesome']
newlst = changeit(list(mylst))
print(mylst)
print(newlst)
答案 0 :(得分:2)
在另一个mylst
函数中包装list()
会创建一个新对象,而不是将操作应用于原始列表对象。
请注意,例如,如果列表包含子列表,则此方法将不起作用-在子列表上执行的操作也会影响原始列表中的子列表。
deepcopy可以用于带有子列表的列表。
答案 1 :(得分:1)
在此处调用list([iterable])
构造函数时会发生这种情况:
newlst = changeit(list(mylst))
它在内存中构造一个新的列表对象。如果将其删除,则将显示以下输出:
>>> newlst = changeit(mylst)
>>> print(mylst)
>>> print(newlst)
['Michigan', 'Wolverines', 'are', 'awesome']
['Michigan', 'Wolverines', 'are', 'awesome']
答案 2 :(得分:-1)
mylst
和a
指向同一对象,因此修改其中任何一个都会改变其他。b
,当您使用list
函数时,它将创建mylst
的新对象。您可以通过比较mylst
,a
和b
mylst = ['106', 'students', 'are', 'awesome']
a = mylst # reference of mylst
b = list(mylst) # copy of mylst
print(id(mylst) == id(a))
print(id(mylst) == id(b))
输出:
True
False