2 回答
TA贡献1818条经验 获得超7个赞
您有一个表示其他对象容器的列表对象。当您执行浅拷贝时,您会创建一个新的列表对象(如您所见),其中包含对原始列表所包含的相同对象的引用。
new_squares[0] = 0是一个任务。你说的是“在列表的第 0 个索引处设置一个新对象”。好吧,列表现在是单独的对象,并且您正在完全替换保存在副本索引处的对象。第 0 个索引处的对象是否是可变的也没关系,因为您只是替换列表对象持有的引用。
如果列表包含一个可变对象,并且您要修改该对象而不完全更改存储在该索引中的对象,那么您将看到两个列表之间的更改。不是因为列表以任何方式链接,而是因为它们包含对您现在已更改的可变对象的引用。
这可以在下面进行说明,我可以分别对浅复制列表进行修改,并且还可以导致可变对象在两个列表之间发生更改,即使该可变对象现在位于两者之间的不同索引处。
# MAKING A CHANGE TO THE LIST
a = [1, {'c': 'd'}, 3, 4]
b = a[:]
b.insert(0, 0)
print(a)
print(b)
print()
# MODIFYING A MUTABLE OBJECT INSIDE THE LIST
a[1]['c'] = 'something_else'
print(a)
print(b)
TA贡献1784条经验 获得超2个赞
列表是可变的,整数是不可变的
当你这样做时:
squares = [1, 4, 9, 16, 25]
new_squares = square[:]
squares 和 new_squares 有不同的 id
如果你这样做:
[id(squares[i]) for i in range(len(squares))]
[id(new_squares[i]) for i in range(len(new_squares))]
您将看到每个整数的相同 id。如果你用另一个值修改一个整数,你将拥有这个整数的新 id
添加回答
举报
