2013-03-19 175 views
3

我正在通過解決項目負責人的問題來練習我的編程技巧,現在我遇到了一些(在我看來)奇怪的行爲蟒蛇。將項目追加到列表(Python)中的指定列表

當我這樣做:

list = [[1]]*20 

我得到的含元素1 20所列出清單,符合市場預期。然而,當我想以一個2追加從該名單中的第三個元素,我會做如下:

list[3].append(2) 

然而,這改變列表中的所有元素。即使我繞道而行,像:

l = list[3] 
l.append(2) 
list[3] = l 

我所有的元素都被改變了。任何人都可以請告訴我如何做到這一點,並得到這樣的輸出:

[[1], [1], [1], [1, 2], [1] .... [1]] 

在此先感謝。

回答

8

Python的列表是可變對象,所以當你[[1]]*20它創建一個名單對象[1],然後放在頂層列表20點對它的引用。

至於可變性問題來講,這是一樣的下面

a = [1,2,3] 
b = a 
b.append(4) 
a # [1,2,3,4] 

這是因爲b=a僅僅把參考到列表中的實例,從ab。他們都指的是相同的實際清單。

爲了創建一個列表清單,就像您在上面嘗試過的一樣,您需要爲每個條目創建一個唯一列表。列表解析工作得很好:

mainlist = [[1] for x in range(20)] 
mainlist[0].append(2) 
mainlist # [[1,2],[1],[1],...] 

編輯

順便說一句,因爲類型名稱在Python元類,通過類型名稱命名變量是一個壞主意。 原因是,可以在代碼中導致幾個問題進一步下跌:

a = range(3) # [0,1,2] 
type(a) # (type 'list') 
isinstance(a, list) # True 

現在,創建一個名爲list

list = range(3) 
list # [0,1,2] 
isinstance(list, list) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

更何況,現在你不能使用list()操作

變量
c = list((1,2,3)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object is not callable 
+0

非常感謝您的快速回復。我只是沒有得到我程序中的錯誤,直到我發現這個好奇心。很高興知道這一點,謝謝。 :) – 2013-03-19 22:49:41

+0

其實我注意到你之前編輯中提到的問題。這只是爲了這個例子的目的,不會再做。 – 2013-03-19 23:00:42

+0

@SanderKersten不用擔心。我只是覺得值得一提,因爲它似乎每隔一段時間就會出現一次......我曾經在自己的代碼中犯過這樣的錯誤,每當我在編輯器中使用一個小三行函數時,然後將它複製到一個更大的程序中並破壞所有內容,所以我不得不讓自己養成習慣只是從來沒有使用變量的類型名稱。 – 2013-03-19 23:03:16

相關問題