python 对象内存地址导致数据被修改的情况

这里定义两个变量,变量a,变量b

b = {"title": "b_title"}
a = b

此时输出a,则控制台输出{"title": "b_title"},这没什么争议性

接下来在a=b后面添加一组代码

b = {"title": "b_title"}
a = b
b["title"] = "b2_title"
print(a)

按照经验代码由上往下执行,a=b,之后便没有对a重新赋值,此时b={"title": "b_title"},那么最后输出a应该也是{"title": "b_title"}

但是,最后结果如下:

主要是因为在对a进行赋值时,a=b,并不是将b的值赋给a,而是将b的内存地址指向a,因此,最终打印输出都会是最终b地址所对应的值。

使用a is b 可以查看对应的地址是否相等:

想解决这个问题,有几个简单函数都可以解决:

  1. 赋予b新的对象(暴力,适用性小)
    b = {"title": "b_title"}
    a = b
    b = {}
    b["title"] = "b2_title"
  2.  调用dict自带的copy方法(只能浅拷贝,多层数据无法彻底解决)
    b = {"title": "b_title"}
    a = b.copy()
    b["title"] = "b2_title"
  3.  导入copy实现深拷贝(copy带有浅拷贝copy方法,深拷贝可以解决多级问题)
    import copy
    
    b = {"title": "b_title"}
    a =copy.deepcopy(b)
    b["title"] = "b2_title"
     

使用拷贝方法后查看对应地址关系:

值相等,地址不相等,所以之后修改b的值不会在影响到a:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值