上一篇中介绍了Python中深拷贝与浅拷贝的区别。既然明白了bug所在,talk is cheap,开撸。
既然是输入数据遭到了修改,那第一思路是将所有出现引用输入数据的地方均加上copy.deepcopy(),使每次在计算时数据可以随便改动,但原始数据保持不变。
但作为一个强迫症来讲,每个地方的引用都加上深拷贝,这对空间和时间的消耗肯定都有增加(虽然对于我的小软件并没有什么明显的区别),所以,必须得找真正改动原始数据的地方,再用深拷贝!
其实这也没什么,无非是看看构造的ui类中的函数有没有修改原始数据的地方,以及引用的函数文件中的函数有没有改变原始数据的地方。
其实代码只有两千多行(小软件……),但是还是检查了一天。。这里为了试验Pandas和Numpy的数据何时会产生变化,还在控制台试了几组数据,粘贴于此:
l
总体来讲“
- 用concat会生成一个全新的对象,对原有的数据并没有引用
- DataFrame直接加上一个数字(经过运算),也得到全新的对象
- 用DataFrame的values属性对一个对象进行赋值,数据会引用,不是深拷贝
- 从数组中取出一个数,对其进行改变,并不影响原数组
但是!
!
!
我在改到后面的代码时,忽然测试到前面仍有类似的问题没有改掉!
一行一行看代码改,这种方法效率太低下了!准确率还不能保证!
必须要找一个简单的测试方法,可以监视每次操作软件时,各数据有没有改动,这部分下篇博客进行介绍。