2013-08-19 69 views
1

雖然測試代碼一些錯誤出現 - 數學運算後,列表「縮小」到自己的最後一個項目Python列表轉換成整數

在Python 3.3解釋它工作正常...

a = [a + b for a, b in zip(a, b)] 

我使用此代碼添加一些列表項

a = [1, 2, 3] 
b = [2, 3, 2] 

能正常工作並返回

>>> a 
[3, 5, 5] 
>>> b 
[2, 3, 2] 

然後寫一個類來處理多個列表:

class Vector: 

    def __init__(self, name = '', vector = []): 
     self.__name = name 
     self.__vector = vector 


    def add_row_to_scalar_multiple(self, vector): 
     self.__vector = [self.__vector + vector.__vector for self.__vector, vector.__vector in zip(self.__vector, vector.__vector)] 


    def __str__(self): 
     vec = ('{0} = {1}'.format(self.__name, self.__vector)) 
     formatted_vec = vec.replace(',', '') 
     return formatted_vec 

當運行具有與上述相同的列表的代碼,一個列表被減少爲單個整數

vec_a = Vector('a', [1, 2, 3]) 
vec_b = Vector('b', [2, 3, 2]) 

a = [1, 2, 3] 
b = [2, 3, 2] 

vec_b.add_row_to_scalar_multiple(vec_a) 


a = 3 
b = [3, 5, 5] 

我剛無法弄清楚我做錯了什麼,所以任何人都可以請幫忙?

+3

這不是你的問題,但是你的'__init__'有一個可變的默認參數,這會讓你稍後頭疼。 – geoffspear

+0

那麼'a'正在變成'3',因爲你正在給它賦值。 – Marcin

+1

'爲自我.__矢量,矢量.__矢量在' - 什麼? – user2357112

回答

3
a = [a + b for a, b in zip(a, b)] 

你不應該使用「A,B」爲迭代變量,它們是不一樣的事情,原來的名單,這導致你做出以爲他們要經常的錯誤和你壓縮的東西一樣。

應該例如a = [aa + bb for aa, bb in zip(a, b)]

然後在將其轉換爲你的類,你會看到,而不是這樣的:

self.__vector = [self.__vector + vector.__vector 
       for self.__vector, vector.__vector 
       in zip(self.__vector, vector.__vector)] 

你應該有這樣的:

self.__vector = [aa + bb 
       for aa, bb 
       in zip(self.__vector, vector.__vector)] 

此外,你的功能應該可能被稱爲__iadd__,但那不是重點。

在一個不相關的注意事項:

self.__vector = vector 

此行有兩個問題。首先,它只是存儲對傳入的列表的引用(可能不是您想要的)。更大的問題是每次您的默認vector = []參數都是相同的列表。除非你知道你在做什麼,否則應該避免使用默認值的可變類型。我會建議self.__vector = list(vector)

+0

因此在聲明中多次使用self .__ vector,vector .__ vector會導致問題? – user2697260

6
self.__vector = [self.__vector + vector.__vector for self.__vector, vector.__vector in zip(self.__vector, vector.__vector)] 

看到了嗎?您正在循環for self.__vector, vector.__vector in zip(self.__vector, vector.__vector)中將值分配給self.__vector, vector.__vector