在写python时中间使用了list互相赋值,结果输出结果并非我想要的结果,最终发现问题是出在list互相赋值上了,看来基础知识不扎实就是容易踩到雷,特此记录一下。
python中的list并不是常规想象的每个list单独存储的真正数组内容,而是地址,因此两个list互相赋值时,就会出现指向同一地址导致一个改变另一个也改变了。比如
a=[1,2,3]
b=a
b[0]=9
print(a)
输出结果发现list a的内容变成了[9,2,3]。
再比如:
>>> a=[1,2,3]
>>> b=a
>>> b[0]=9
>>> print(a)
[9, 2, 3]
>>> print(b)
[9, 2, 3]
>>> c=[]
>>> c=a
>>> print(a)
[9, 2, 3]
>>> c[0]=8
>>> print(b)
[8, 2, 3]
>>>
可以发现,后面把a赋值给c,对c修改,结果b也躺枪改变了,因此一定要慎用直接list之间赋值,否则bug找到头大。
解决方法:
不要简单粗暴的直接赋值,可以引入copy包,使用copy.deepcopy()即可避免这样的问题
>>> a=[1,2,3]
>>> b=a
>>> import copy
>>> c=copy.deepcopy(a)
>>> print(c)
[1, 2, 3]
>>> c[0]=9
>>> print(c)
[9, 2, 3]
>>> print(a)
[1, 2, 3]
>>>
使用了deepcopy,在改变c时不会影响a和b。