2

我的问题是关于 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       

谢谢你提供的所有帮助。

4

1 回答 1

4

greater = self.coeffs不复制self.coeffs. greater现在self.coeffs指向同一个列表对象。

如果要克隆列表,请对其进行切片:

greater = self.coeffs[:]

或者通过list内置传递它:

greater = list(self.coeffs)

此外,您应该重写__add__而不是创建自己的方法,因为这样您就可以使用加法运算符实际添加两个对象。

2x^2 + 1如果您将多项式“向后”表示(例如变为[1, 0, 2]),您可能还会发现将多项式相加起来更容易

于 2013-07-06T22:29:52.187 回答