在测试代码时出现了一些错误 - 在数学运算之后,列表'缩小'到自己的最后一项
在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]
我无法弄清楚我做错了什么,所以任何人都可以帮忙吗?
答案 0 :(得分: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)
分配值。
答案 1 :(得分: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)
。