※ 引述《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)
那复制参照跟直接复制应该就没啥差别惹。
大概是这样