参考:
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]]]