当我迭代并更改它的副本时,原始列表会更改



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

感谢您提供的任何帮助。

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

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

greater = self.coeffs[:]

或者通过内置的list传递它:

greater = list(self.coeffs)

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

如果您"向后"表示多项式,您可能还会发现将它们相加更容易(例如 2x^2 + 1变得[1, 0, 2](

相关内容