2012-05-05 27 views
1

我有10個元素的列表,其中包含2個元素的元組我想爲每個元組添加一個值,但是當我編寫下面的代碼時,似乎計算了累積和。這是怎麼發生的。請幫助列表修改如何在Python中工作

# -*- coding: utf-8 -*- 
i=0 
k=10 
count=[] 
value=[1,2] 
while i < k: 
    count.append(value) 
    i=i+1 
t=[10,2] 
i=0 
#for item in count: 
    #print item 
while i <(len(count)): 
    count[i][0]+=t[0]; 
    count[i][1]+=t[1]; 
    i+=1; 

for item in count: 
    print item 

outpus是走出來是

[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 
[101, 22] 

這裏,我希望它是

[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 
[11, 4] 

回答

3

這是因爲您實際上有一個對同一(單個)2項目列表的十個參考列表。您在第二個循環中反覆添加到同一個列表中。你真的想要一個新的子列表實例(以及你真正擁有的是一個可變列表,而不是元組)。

你可以這樣做:

while i < k: 
    count.append(value[:]) 
    i=i+1 

使嵌入列表的新副本。

+0

非常感謝..它幫助 – manyu

+0

非常好@Keith –

2

試試這個:

i=0 
k=10 
count=[] 

while i < k: 
    count.append([1,2]) 
    i=i+1 

t=[10,2] 
i=0 

while i <(len(count)): 
    count[i][0]+=t[0]; 
    count[i][1]+=t[1]; 
    i+=1; 

for item in count: 
    print item 

的問題是在此行:count.append(value),您將相同可變引用[1, 2]添加到count列表,並不斷更新它。

通過用count.append([1,2])代替行,確保每次添加新的不同列表時。

順便說一句,你沒有在你的代碼中的任何地方使用元組(如問題所述),只列出。

+0

是的,它的工作原理......但上面的代碼不起作用??我必須在一個程序中使用一個列表,所以我不能這樣編碼 – manyu

+0

@manyu我只是用解釋更新了我的答案,我希望現在很清楚。 –

+0

@manyu有了這個解決方案,你可以在程序中列出具有可以更改的值的列表,所以目前還不清楚問題所在。 –

0

問題是python如何使用內存,每次你追加值來計數,你實際上是附加一個引用值的內存位置。發生什麼事是每當你循環遍歷t [0]被添加到值[0]時。下面(你使用相同的設置)

n [54]: for i, item in enumerate(count): 
print count[i]; 
count[i][0] += t[0] 
print count[i] 
....:  
[1, 2] 
[11, 2] 
[11, 2] 
[21, 2] 
[21, 2] 
[31, 2] 
[31, 2] 
[41, 2] 
[41, 2] 
[51, 2] 
[51, 2] 
[61, 2] 
[61, 2] 
[71, 2] 
[71, 2] 
[81, 2] 
[81, 2] 
[91, 2] 
[91, 2] 
[101, 2] 

看到它的行動而不是爲輸出你想要追加剛纔列表對象本身[1,2]沒有它賦值給一個變量。另外,enumerate()(一個內置的python)會在循環中產生索引號和項目,所以你不必在任何地方使用whiles。