看板 Programming
作者 標題 Re: 新手再度發問Python list問題
時間 2012年09月23日 Sun. AM 02:40:35
※ 收件者: Leon
這個要解釋起來有點...
不過儘量白話一點
先講到[:](Slice 切片),這個原本在字串物件常用的取值方法
在Python裡,字串是字元的集合,一個字串變數,可視為是以字元組成的List
所以可以用index的方式取得這個“List”裡的元素,不管是用正索引、負索引都可以
例如:
>>> S
'Spam'
>>> S[1:3] ## 可視為“回傳從陣列索引1開始,但不包含索引3為止的元素”
'pa'
>>> S[1:] ## 可視為S[1:len(S)]
'pam'
>>> S[0:3] ## “回傳從陣列索引0開始,但不包含索引3為止的元素”
'Spa'
>>> S[:3] ## 等同S[0:3]
'Spa'
>>> S[:-1] ## 等同S[0:-1],“回傳除了最後一個元素外的其它一切”
'Spa'
>>> S[:] ## 等同S[0:len(S)]
'Spam'
所以[:]等同於把字串物件,或List物件,從頭到尾“叫出來”(“列出來”也行啦=皿=)
再來,原PO的問題要注意到「巢狀List」
不管是
n = m[:]
或是
v = u[:]
都是一樣的結果
差異只在於
n += [[2,2]]
是在原本建立的[[0,0], [1,1]]這個List物件之後,再追加一個[2,2]的List物件
但
v[0] += [2]
是在原本建立的[[0,0], [1,1]]這個List物件的索引值0(第一個List)本身,加入一個2的元素
啊...說到這裡有點亂,我再重整一下
m = [[0,0], [1,1]]
m[0] = [0,0]
m[1] = [1,1]
u = [[0, 0], [1, 1]]
u[0] = [0,0]
u[1] = [1,1]
這樣對吧?
而
n += [[2,2]]
事實上是增加了一個 m[2] = [2,2]
而
v[0] += [2]
事實上是在 u[0] 追加了一個 2
所以兩個case是不對等的
啊,再補上幾件事
a = [1,2,3]
事實上是建立了一個值為[1,2,3]的List型態的物件
而 a 是這個物件的標籤
b = a
是再追加一個名為 b 的標籤在原本這個物件上
若
b = a[:]( 或 b = list(a) )
是可以建立出另一個List物件
但在nested list(巢狀List時會出錯,a標籤及b標籤仍然會被貼到同一個物件上)
所以原PO的案例,可以用deepcopy()來解決
>>> m = [[0,0], [1,1]]
>>> n = m[:]
>>> import copy
>>> z = copy.deepcopy(m)
>>> m
[[0, 0], [1, 1]]
>>> n
[[0, 0], [1, 1]]
>>> z
[[0, 0], [1, 1]]
>>> n[0] += [2]
>>> m
[[0, 0, 2], [1, 1]]
>>> n
[[0, 0, 2], [1, 1]]
>>> z
[[0, 0], [1, 1]]
※ 引述《Leon》之銘言:
:
:
:
請問python list問題
: >>> # case 1
: >>> m = [[0,0], [1,1]]: >>> n = m[:]: >>> n += [[2, 2]]: >>> n
: [[0, 0], [1, 1], [2, 2]]: >>> m
: [[0,0], [1,1]]: >>> #case2
: >>> u = [[0, 0], [1, 1]]: >>> v = u[:]: >>> u is v
: False
: >>> v[0] += [2]: >>> v
: [[0, 0, 2], [1, 1]]: >>> u
: [[0, 0, 2], [1, 1]]: >>> v is u
: False
: 請問一下,怎麼會這樣啊?
: 為什麼m跟n不會一起變
: 而v is not u但v跟u卻會一起變?
:
:
: ※ 編輯: Leon 時間: 2011-02-16 01:36:52 來自: 220-132-231-11.HINET-IP.hinet.net
--
※ 作者: chibakuma 時間: 2012-09-23 02:40:35
※ 編輯: chibakuma 時間: 2012-09-23 03:12:15
※ 同主題文章:
02-16 01:30 □ 新手再度發問Python list問題
02-17 20:57 Re 新手再度發問Python list問題
● 09-23 02:40 Re 新手再度發問Python list問題
02-17 22:27 Re 新手再度發問Python list問題
※ 看板: Programming 文章推薦值: 2 目前人氣: 0 累積人氣: 976
回列表(←)
分享