2014-03-27 39 views
0

我想用pythons列出一個列表,我知道有兩種方法可以實現。編輯列表中的項目時遇到問題

第一種方法是像這樣:

l = [] 
l_in = [] 
for j in range(2): 
    l_in.append("1") 
print l_in 
for i in range(2): 
    l.append(l_in) 
print l 

,第二種方法是:

l = [] 
for i in range(2): 
    l.append([1]*2) 
print l 

這兩種方法創建一個列表

l = [['1', '1'], ['1', '1']] 

我想改變只在元素int此列表說明(1,1)元素。如果我做

l[1][1] = "Something I want to replace with" 

該元素應該被替換。這適用於第二種方法。但如果我使用第一種方法(1,1)(0,1)更改爲"Something I want to replace with"

有人能告訴我爲什麼使用第一種方法給出這個輸出?

回答

4

這是因爲在第一種方法,在第二循環中你兩次追加相同的列表。

for i in range(2): 
    l.append(l_in) 

一個列表現在,只要你在l修改的元素,你實際上是修改的元素。理解一個簡單的方法是查看內置的id()l的內容給出的值。

>>> map(id, l) 
[32750120, 32750120] 

你可以看到,在l兩個元素共享相同的ID(和相同的內存地址)。他們都提到相同的列表l_in

作爲一個自動winiचhaudhary建議,一個簡單的修復程序是l.append(l_in[:])其中[:]創建列表l_in的副本。

l = [] 
l_in = [] 
for j in range(2): 
    l_in.append("1") 
print l_in 
for i in range(2): 
    l.append(l_in[:]) 
print l 

您還可以使用列表和生成器解析來創建列表清單。下面的一些例子:

# empty lists.. 
>>> [[] for _ in range(4)] 
[[], [], [], []] 

# generator expression.. 
>>> list([] for _ in range(4)) 
[[], [], [], []] 

# [1, 1] for each sublist. 
>>> list([1, 1] for _ in range(4)) 
[[1, 1], [1, 1], [1, 1], [1, 1]] 

這裏的help()id()

Help on built-in function id in module __builtin__: 

id(...) 
    id(object) -> integer 

    Return the identity of an object. This is guaranteed to be unique among 
    simultaneously existing objects. (Hint: it's the object's memory address.) 
+1

和快速的解決辦法是使用'l.append(L_IN [:])' –

+0

@Aशwiniचhaudhary補充說明,謝謝。 SO有一些編碼問題:) – msvalkon

+1

這是故意的,我不希望人們用鍵盤鍵入我的名字。 :P無論如何,我已經給你+1。 –

相關問題