list的值为什么自己改变了?-----python中使用list时必需注意的赋值坑

在写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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值