赋值b=a、浅拷贝copy.copy()、深拷贝copy.deepcopy()

参考:
https://blog.csdn.net/shine_00/article/details/126092055
https://blog.csdn.net/Goodness2020/article/details/125919858

发现问题的契机:

# 如果直接val = true_val_pred[pos[i][1]:pos[i][3], pos[i][0]:pos[i][2]]
# 那么当true_val_pred[pos[i][1]:pos[i][3], pos[i][0]:pos[i][2]]改变时,如true_val_pred[pos[i][1]:pos[i][3], pos[i][0]:pos[i][2]] = Y_val_pred[i]
# val也会随之改变
# b=a是赋值语句,b指向a的地址,a和b任何一个改变了,另一个也跟着改变
# !!!如果想要val不变,则需要浅拷贝,val = true_val_pred[pos[i][1]:pos[i][3], pos[i][0]:pos[i][2]].copy()
# b=a.copy()是把a的值赋给b,a和b有不同的内存地址,一个改变了,另一个不变

!!!

  • 直接赋值:新变量直接引用原对象,任一对象改变,则所有指向了同一可变对象的变量都作相同改变。

  • 浅拷贝:使用 copy.copy() 函数实现,浅拷贝原变量指向的对象的最外层,但引用原变量指向的对象的内层。

  • 深拷贝:使用 copy.deepcopy() 函数实现,拷贝可变对象的最外层对象及子对象,新变量指向的和原变量指向的对象两者完全独立

import copy

a = [1, 2, [3, [4, 5]]]
b = a                 # 直接赋值: 引用对象,原始对象的最外层到最内层对象均被引用
c = copy.copy(a)          # 浅拷贝:原始对象的最外层对象深拷贝,除外层的所有层对象直接赋值
d = copy.deepcopy(a)  # 深拷贝,原始对象的最外层到最内层对象均不因原对象的改变而改变

a.append(6)
a[2].append(7)
a[2][1].append(8)

print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)
a: [1, 2, [3, [4, 5, 8], 7], 6]
b: [1, 2, [3, [4, 5, 8], 7], 6]
c: [1, 2, [3, [4, 5, 8], 7]]   
d: [1, 2, [3, [4, 5]]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pythonistas29xs

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值