python不可变类型和可变类型(为什么我的列表/字典,没有改变它却自己变了?)

大家在刚接触或平时使用python的时候,可能都会出现类似如下的情况:

a = [1, 2]
b=a
print('改变b前,a的值:',a)
b[0] = 2
print('改变b后,a的值:',a)
print('b:', b)
--------输出结果-------------
	改变b前,a的值: [1, 2]
	改变b后,a的值: [2, 2] # 没有改变a,a不应该等于[1,2]吗? 为什么等于[2,2]了
	b: [2, 2]

为什么我只给b赋值,但a却被改变了?

a不应该等于[1,2]吗!!!

这里就需要了解python中可变类型和不可变类型的区别了
在上述代码中,虽然a的值赋值给了b,但由于a是一个可变类型,赋予b的值实际上是a的内存地址,这个时候b和a共用一个内存地址,在改变b值的操作后,由于内存地址未发生变化,所以a的值也相当于被改变了。
python中可变类型有三种:list, dict,set
那如何让改变b的时候,不改变a呢?
可以使用深拷贝:

import copy

a = [1, 2]
b = copy.copy(a)  # 深拷贝a
print('改变b前,a的值:', a)
b[0] = 2
print('改变b后,a的值:', a)
print('b:', b)
--------输出结果-------------
	改变b前,a的值: [1, 2]
	改变b后,a的值: [1, 2]
	b: [2, 2]

如果是不可变类型(string,int,float,tuple),则不会出现上述情况

b = a = 2
print('改变b前,a的值:', a)
b = 1
print('改变b后,a的值:', a)
print('b:', b)
--------输出结果-------------
	改变b前,a的值: 2
	改变b后,a的值: 2
	b: 1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曲鸟

不要打赏,没必要!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值