python浅拷贝和深拷贝和直接赋值

import copy

a = [1,2,3,4]
id(a)
# 4386320704

b = copy.copy(a)  # 浅拷贝
id(b)
# 4384379840

c = a  # 赋值
id(c)
# 4386320704

d = copy.deepcopy(a)  # 深拷贝
id(d)
# 4425048864

"""
以上可以看出,只有直接赋值的内存地址和原数据的相同,说明他们指向同一地址,
而浅拷贝和深拷贝都是新的地址
"""

a.append([5,6,7])
# a = [1, 2, 3, 4, [5, 6, 7]]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7]]
# d = [1, 2, 3, 4]

a.append(8)
# a = [1, 2, 3, 4, [5, 6, 7], 8]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7], 8]
# d = [1, 2, 3, 4] 

"""
这时候改变原数据,只有直接赋值的c和a一起变化,其它的不变,为什么呢?
因为最开始拷贝的时候,原数据a中没有引用数据,都是不可变的基础数据
"""

# 现在我们重新拷贝一次
b = copy.copy(a)
# b = [1, 2, 3, 4, [5, 6, 7], 8]

d = copy.deepcopy(a)
# d = [1, 2, 3, 4, [5, 6, 7], 8]

a.append(9)
# a = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

a[3]=44
# a = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

"""
深拷贝:原数据不管怎么变,它都不会变
浅拷贝:在修改原数据的不可变变量时浅拷贝是不会变化的
直接赋值:不管原数据怎么变,它都跟着变
"""

# 现在我们变化一下a中的可变变量
a[4][0]=55
# a = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [55, 6, 7], 8]
# c = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]

"""
浅拷贝:原数据不可变变量增加修改删除,它都不会跟着变;原数据可变变量的变化它回跟着变化
"""

"""
总结:
深拷贝:不管原数据怎么变,它都不会变(深度拷贝,连引用部分的数据也都直接拷贝过来)
直接赋值: 不管原数据怎么变,它都跟着变(和原数据共用一块内存地址,实际是原数据的一个引用)
浅拷贝:原数据里不可变的数据怎么变,它都不会变;原数据里可变部分怎么变,它都跟着变
(原数据不可变的部分直接拷贝,原数据引用部分仍然拷贝引用,而不是实际数据)
"""


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章