我的问题是关于Python 3中的列表。在下面的代码中,我给出了一个类的方法,其目的是模仿多项式的数学行为。该类将包含多项式算术的方法,以及一个属性。此属性是多项式中系数的列表,其中元素按多项式的正常顺序列出。例如,7x ^ 3 + 3x + 4变为[7,0,3,4]
下面的add()方法试图模仿视觉上的右对齐加法,就像在普通算术中一样。它通过首先找到哪个列表较短,然后将其元素添加到较长列表中的相应元素,然后通过此更改返回较长列表来实现。但是,我不希望实际更改任何原始列表的副作用,因此我已将原始列表分配给方法 - 内部列表越来越少。当我创建两个多项式p = P([1,2,3])和q = P([1,2,3]),然后调用p.add(q)时,会发生加法,但没有打印到屏幕,当我检查p.coeffs时,显示为[2,4,6]。
class P:
coeffs = []
def __init__(self,coeffs):
self.coeffs = coeffs
def add(self,q):
if len(self.coeffs) >= len(q.coeffs):
greater = self.coeffs
lesser = q.coeffs
else:
greater = q.coeffs
lesser = self.coeffs
i = -1
while i >= -len(lesser):
greater[i] = greater[i]+lesser[i]
i=i-1
return greater
感谢您提供任何帮助。
答案 0 :(得分:4)
greater = self.coeffs
不会复制self.coeffs
。 greater
和self.coeffs
现在指向同一个列表对象。
如果要克隆列表,请将其切片:
greater = self.coeffs[:]
或者将其传递给list
内置:
greater = list(self.coeffs)
此外,您应该覆盖__add__
而不是自己创建方法,因为这样可以让您使用加法运算符实际添加这两个对象。
如果您将多项式“向后”(例如2x^2 + 1
变为[1, 0, 2]
),您可能还会发现将多项式添加到一起更容易