2014-07-24 90 views
0

我正在創建列表列表。當我選擇一個特定的索引時,它會同時設置多個列表條目。這裏發生了什麼?Python:奇怪列表索引行爲

x = [] 
for i in range(3,6+1,1): 
    x.append([['','']] * i) 

x[0][0][0] = 1 
for col in x: 
    print col 

輸出:

[[1, ''], [1, ''], [1, '']] 
[['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 

它仍然是一個懸而未決的問題,爲什麼不工作......這裏有一個解決方案,但...

x = [] 
for i in range(3,6+1,1): 
    y = ['',''] 
    tmp = [] 
    for j in range(i): 
     tmp.append(y[:]) 
    x.append(tmp) 

x[0][0][0] = 1 
for col in x: 
    print col 

輸出:

[[1, ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 

回答

2

當你乘以列表時,對象是r電子使用,所以當你修改其中的一個,你似乎修改它們的「全部」。事實上,只有一個內部列表,但它出現在外部列表中的多個位置!

>>> x = [] 
>>> x.append([['','']] * 3) 
>>> x 
[[['', ''], ['', ''], ['', '']]] 
>>> x[0][0][0] = 1 
>>> x 
[[[1, ''], [1, ''], [1, '']]] 

如果內部列表單獨創建的,所以它們是不同的對象,你沒有得到這個問題:如果您創建使用理解列表

>>> x = [[]] 
>>> x[0].append(['','']) 
>>> x[0].append(['','']) 
>>> x[0].append(['','']) 
>>> x 
[[['', ''], ['', ''], ['', '']]] 
>>> x[0][0][0] = 1 
>>> x 
[[[1, ''], ['', ''], ['', '']]] 

,也避免了問題,例如:

x = [[['',''] for _ in range(3)]] 
+0

是啊...這不是一個相當不受歡迎的python特性嗎? –

+0

如果你認爲它是複製指針列表(內部列表),那麼我認爲它更有意義...... – DNA