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
添加回答
舉報