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

当使用与上面相同的列表运行代码时,一个列表被缩减为一个整数

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

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

看到了吗?您self.__vector, vector.__vector在循环中分配值for self.__vector, vector.__vector in zip(self.__vector, vector.__vector)

于 2013-08-19T17:45:28.777 回答
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)

于 2013-08-19T17:48:49.667 回答