1

コードのテスト中にいくつかのエラーが発生しました - 数学演算の後、リストはそれ自体の最後の項目に「縮小」します

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

上記と同じリストでコードを実行すると、1 つのリストが 1 つの整数に縮小されます。

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]

私は自分が間違っていることを理解できないので、誰か助けてください??

4

2 に答える 2

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

この行には 2 つの問題があります。1 つには、渡されたリストへの参照を格納しているだけです (これは、必要なものではない可能性があります)。より大きな問題は、デフォルトvector = []の引数が毎回同じリストであることです。何をしているのかわからない限り、デフォルトの可変型は避けるべきです。私はお勧めしself.__vector = list(vector)ます。

于 2013-08-19T17:48:49.667 に答える