※ 引述《why8ther (外八喵)》之銘言:
: 已知:
: b = [2, 3]
: >>> b[0] = 99
: b = [99, 3]
: a = [1, 2, 3, 4]
: 由此可知,黃色那行的值並不會改動到a陣列,而是創造一個副本了
: 我的問題是 :
: 這個副本是(1) 在我呼叫a[1:3]時就被創造了?
: 抑或(2) 直到我改動b[0]才被創造,若不改動就永遠參照本來陣列
: 因為最近遇到比較高的性能要求 需要弄清楚@@
: 第一次po文 請大家多多指教
自己回自己的文XDD
其實應該是有實作copy on write的
根據這篇stack overflow http://goo.gl/XcgHG6
我自己實驗也是一樣的結果
>>> a = [1,2,3]
>>> b = a[1:3]
>>> id(a[1])
1440535008
>>> id(b[0])
1440535008
>>> b[0] = 123
>>> a
[1, 2, 3]
>>> b
[123, 3]
>>> id(a[1])
1440535008
>>> id(b[0])
1440536944 變得不一樣了!!
>>> id(a[2])
1440535024
>>> id(b[1]) 但a[2]和b[1]沒有被改動,仍是同一個
1440535024
不過雖說是copy on write,但我推測應該還是複製了陣列中每個元素的referance
而不只是陣列本身的referance
推測根據就是上面那行紅字。
若本來陣列長度是100,就等於複製了100份的參照。
所以比較適合的狀況應該是:
陣列中每個物件很大,但陣列本身較短
反之,若陣列元素很小(像是int)
那複製參照跟直接複製應該就沒啥差別惹。
大概是這樣