浅析python中的深拷贝和浅拷贝
浅拷贝:拷贝父对象,不会拷贝父对象内部的子对象
深拷贝:拷贝父对象,同时也会拷贝父对象内部的子对象
下面从内存地址去分析
# 定义一个父对象‘d’
d = {
    'name': 'anna',
    'sex': 'male',
    'age': ['one', 'two', 'three']
}
一、浅拷贝
# 父对象‘d’进行浅拷贝,得到父对象'd_copy'
d_copy = copy.copy(d)
# 父对象的内存地址(不同)
print(id(d), id(d_copy))  # 2471021077888 2471021078080
# 子对象‘name’的内存地址(相同)
print(id(d['name']), id(d_copy['name']))  # 1290963945648 1290963945648
# 子对象‘sex’的内存地址(相同)
print(id(d['sex']), id(d_copy['sex']))  # 1290963663856 1290963663856
# 子对象‘age’的内存地址(相同)
print(id(d['age']), id(d_copy['age']))  # 1290964013120 1290964013120
'''从内存地址分析可以知道:
父对象d与父对象d_copy内存地址不同
父对象d中的子对象的内存地址与父对象d_copy中的子对象地址一样
说明:浅拷贝只拷贝父对象,不会拷贝子对象。子对象使用的是同一片内存空间,也就是说只要父对象d_copy中的子对象发生改变,父对象d中的子对象随着改变
可以联系生活中的例子:一栋房子里面只有2个房间,共用一个洗手间,洗手间坏了,2个房子里面的人就都不可使用洗手间,只有修好洗手间大家就都可以使用了
'''
# 修改子对象
d_copy['age'].pop(0)
print(d_copy)  # # {'name': 'anna', 'sex': 'male', 'age': ['lucy', 'tina']}
print(d)  # # {'name': 'anna', 'sex': 'male', 'age': ['lucy', 'tina']}
二、深拷贝
# 父对象‘d’进行浅拷贝,得到父对象'd_deep'
d_copy = copy.deepcopy(d)
# 父对象的内存地址(不同)
print(id(d), id(d_deep))  # 2050376623488 2050383944320
# 子对象‘name’的内存地址(相同)
print(id(d['name']), id(d_deep['name']))  # 2050381219952 2050381219952
# 子对象‘sex’的内存地址(相同)
print(id(d['sex']), id(d_deep['sex']))  # 2050380950896 2050380950896
# 子对象‘age’的内存地址(不相同)
print(id(d['age']), id(d_deep['age']))  # 2050383879808 2050383889088
'''从内存地址分析可以知道:
父对象d与父对象d_deep内存地址不同
父对象d中的子对象‘name’、‘sex’的内存地址与父对象d_deep中的子对象‘name’、‘sex’地址一样
父对象d中的子对象‘age’的内存地址与父对象d_deep中的子对象‘age’地址不同
说明:深拷贝拷贝了父对象的同时也会拷贝子对象。子对象使用不是同一片内存空间,也就是说父对象d_copy中的子对象发生改变,不会给父对象d中的子对象造成影响
可以联系生活中的例子:一栋楼里面只有2户人家,其中一户的洗手间坏了,不会影响另外一户人家的洗手间的使用
'''
# 修改子对象
d_deep['age'].pop(0)
print(d_deep)  # {'name': 'anna', 'sex': 'male', 'age': ['lucy', 'tina']}
print(d)  # {'name': 'anna', 'sex': 'male', 'age': ['lili', 'lucy', 'tina']}有人会有疑问了:你不是说深拷贝会拷贝父对象,同时也会拷贝父对象内部的子对象吗,为什么子对象'name'和'sex'内存地址还一样共用的是同一片内存空间?
答:深拷贝和浅拷贝的前提是在可变对象和不可变对象的基础上来讨论的。
可变对象:列表、字典、集合
不可变对象:数字、元组、字符串
由于在深拷贝中子对象'name'和'sex'属于不可变对象中的字符串,所以不参与深拷贝,因此内存地址不变
深拷贝和浅拷贝的特点:
浅拷贝:copy.copy效率高,开销小,数据不隔离(子对象共用同一片内存)
深拷贝:copy.deepcopy 效率低,开销大,数据完全隔离 安全性高
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号