即使未使用它们,也会修改值

时间:2015-06-05 10:06:45

标签: python

我有一个python脚本,它应该读取txt文件中的值,处理它们的备份,然后绘制它们。代码如下:

class fit_to_init_values:
    def __init__(self, filename):
        lines = tuple(open(filename, 'r'))
        self.arr = []
        self.xdata = []
        self.xdata_old = []
        self.ydata = []
        self.ydata_old = []
        print len(lines)
        for elem in lines:
            a = elem.split(", ")
            if len(a) == 3:
                data = data_point(float(a[0]), float(a[1]))
                self.arr.append(data)
            else:
                print len(a)
        for elem in self.arr:
            self.xdata.append(elem.x)
            self.ydata.append(elem.y)
        self.xdata_old = self.xdata
        print self.xdata[0]
        self.ydata_old = self.ydata    

    def reduce_stuff(self):
        idx = self.ydata.index(max(self.ydata))
        self.max1 = max(self.xdata)
        tmp = self.xdata
        for i, elem in enumerate(tmp):
            tmp[i] = (tmp[i] - 1.254111749e14)/self.max1
        print self.xdata[0]

    def plot_data(self, num):
                if num == 0:
                    plt.plot(self.xdata_old, self.ydata_old, 'bs')
                    print("Plot 0")
                    plt.show()

,它被称为:

test = fit_to_init_values("pulse1.txt")
test.reduce_stuff()
test.plot_data(0)

现在输出的是:

4096
7.42611749e+13
-0.289578281623
Plot 0

表示self.xdata函数明显reduce_stuff()修改了什么意思。如果我用self.xdata[0]替换打印print self.xdata_old[0],也会发生同样的情况。为什么这些值会改变,即使我从不对它们进行操作? 如有必要,我还可以提供文件“pulse1.txt”。

1 个答案:

答案 0 :(得分:1)

您只是将ydata的引用复制到ydata_old。 因此,当您更改ydata时,ydata_old会更改。

试试这个

import copy
self.ydata_old = copy.deepcopy(self.ydata)
self.xdata_old = copy.deepcopy(self.xdata)

deepcopy将整个对象复制到ydata_old而不仅仅是引用。

这是因为列表是可变的,您对新数据所做的任何更改都会反映在旧数据中。

澄清对评论的疑虑,为什么同样适用于

a=5
b=a
a += 2
a==7
b==5

试试这个

>>> a=5
>>> id(a)
140547708740344
>>> b=a
>>> id(b)
140547708740344
>>> a+=2
>>> id(a)
140547708740296
>>> id(b)
140547708740344

这里'a'是可变的, b = a指定a到b的引用 现在,当调用+ = 2时,会创建一个新对象,并将其引用分配给“a”,保持原样“b”。 在这里你可以看到当你做+ = 2时'a'的id改变了,希望有帮助

有关mutable vs immutable的进一步说明,试试这个: - Immutable vs Mutable types