Python的列表是可變對象,所以當你[[1]]*20
它創建一個名單對象[1]
,然後放在頂層列表20點對它的引用。
至於可變性問題來講,這是一樣的下面
a = [1,2,3]
b = a
b.append(4)
a # [1,2,3,4]
這是因爲b=a
僅僅把參考到列表中的實例,從a
到b
。他們都指的是相同的實際清單。
爲了創建一個列表清單,就像您在上面嘗試過的一樣,您需要爲每個條目創建一個唯一列表。列表解析工作得很好:
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
非常感謝您的快速回復。我只是沒有得到我程序中的錯誤,直到我發現這個好奇心。很高興知道這一點,謝謝。 :) – 2013-03-19 22:49:41
其實我注意到你之前編輯中提到的問題。這只是爲了這個例子的目的,不會再做。 – 2013-03-19 23:00:42
@SanderKersten不用擔心。我只是覺得值得一提,因爲它似乎每隔一段時間就會出現一次......我曾經在自己的代碼中犯過這樣的錯誤,每當我在編輯器中使用一個小三行函數時,然後將它複製到一個更大的程序中並破壞所有內容,所以我不得不讓自己養成習慣只是從來沒有使用變量的類型名稱。 – 2013-03-19 23:03:16