我有一个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”。
答案 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