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

时间:2013-07-06 22:27:20

标签: python list python-3.x

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

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:4)

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

如果要克隆列表,请将其切片:

greater = self.coeffs[:]

或者将其传递给list内置:

greater = list(self.coeffs)

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

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