[問題] a[1:3]會馬上複製嗎?

看板Python作者 (外八喵)時間10年前 (2015/07/13 16:52), 編輯推噓2(207)
留言9則, 6人參與, 最新討論串1/2 (看更多)
已知: >>> a = [1,2,3,4] >>> b = a[1:3] b = [2, 3] >>> b[0] = 99 b = [99, 3] a = [1, 2, 3, 4] 由此可知,黃色那行的值並不會改動到a陣列,而是創造一個副本了 我的問題是 : 這個副本是(1) 在我呼叫a[1:3]時就被創造了? 抑或(2) 直到我改動b[0]才被創造,若不改動就永遠參照本來陣列 因為最近遇到比較高的性能要求 需要弄清楚@@ 第一次po文 請大家多多指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.96.27.107 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1436777542.A.324.html

07/13 17:01, , 1F
第二行,把a[1:3] assign給變數b
07/13 17:01, 1F

07/13 17:03, , 2F
b與a無關,是獨立的變數
07/13 17:03, 2F

07/13 17:53, , 3F
沒看 source, 但我猜應該不會, 這是很常見的最佳化
07/13 17:53, 3F

07/13 17:54, , 4F
如果真的需要保證, 可以改用 memory view 來替代
07/13 17:54, 4F

07/13 17:58, , 5F
喔我錯了, 好像會 shallow copy, 沒有 implicit sharing
07/13 17:58, 5F

07/13 20:10, , 6F
用 b = a[:] 就很清楚了,會直接產生新物件
07/13 20:10, 6F

07/13 22:14, , 7F
Python 的 list 並沒有實作 copy-on-write
07/13 22:14, 7F

07/13 22:43, , 8F
瞭解 謝謝大家 看來要改寫法了QQ
07/13 22:43, 8F

07/14 11:43, , 9F
看來你不想要複製? 那可以用 itertools.islice
07/14 11:43, 9F
文章代碼(AID): #1Letn6Ca (Python)
討論串 (同標題文章)
文章代碼(AID): #1Letn6Ca (Python)