亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

list[:] 的淺拷貝

list[:] 的淺拷貝

呼如林 2022-01-11 16:45:30
根據這個官方文檔:list[:]通過淺拷貝創建一個新列表。我進行了以下實驗:>>> squares = [1, 4, 9, 16, 25]>>> new_squares = square[:]>>> squares is new_squaresFalse>>> squares[0] is new_squares[0]True>>> id(squares)4468706952>>> id(new_squares)4468425032>>> id(squares[0])4466081856>>> id(new_squares[0])4466081856這里的一切看起來都不錯!new_square 和 square 是不同的對象(這里列出),但由于淺拷貝,它們共享相同的內容。但是,以下結果讓我感到困惑:>>> new_squares[0] = 0>>> new_squares[0, 4, 9, 16, 25]>>> squares[1, 4, 9, 16, 25]我更新了 new_square[0] 但 square 不受影響。我檢查了他們的身份證:>>> id(new_squares[0])4466081824>>> id(squares[0])4466081856您會發現 squares[0] 的 id 沒有變化,但 new_squares[0] 的 id 發生了變化。這和我之前理解的淺拷貝有很大的不同。誰能解釋一下?謝謝!
查看完整描述

2 回答

?
qq_笑_17

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)


查看完整回答
反對 回復 2022-01-11
?
一只斗牛犬

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


查看完整回答
反對 回復 2022-01-11
  • 2 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號