顯示廣告
隱藏 ✕
看板 Programming
作者 chibakuma (ChibaKuma)
標題 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
※ 看板: Programming 文章推薦值: 2 目前人氣: 0 累積人氣: 976 
分享網址: 複製 已複製
( ̄︶ ̄)b gogomako, Knuckles 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇