day07 Python 深浅拷贝

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: fhb
# @Date  : 2018/10/25
# @Desc  :


## 赋值

# 对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量量. 并不是复制一份内容. 所以. lst1的内存指向和lst2是⼀一样的. lst1改变了了, lst2也发⽣生了了改变

lst1 = ["⾦金金⽑毛狮王", "紫衫⻰龙王", "⽩白眉鹰王", "⻘青翼蝠王"]

lst2 = lst1 # 赋值 ,此时lst2 在内存中没有创建新对象,而是直接指向lst1的内存地址。
print(lst1) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王']
print(lst2) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王']
lst1.append("杨逍")
print(id(lst1) == id(lst2)) # True;内存地址一致,所以修改一个列表,另外一个列表内容也发生了变化

print(lst1) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']
print(lst2) # ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']


## 浅拷贝

lst1 = ["何炅", "杜海海涛","周渝⺠民"]
lst2 = lst1.copy()
lst1.append("李李嘉诚")
print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', '李李嘉诚']
print(lst2) # ['何炅', '杜海海涛', '周渝⺠民']  此时发现lst1和lst2的值不一致,
print(id(lst1) == id(lst2)) # False 而且内存地址也不同,此时发生了内存拷贝。# 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷⻉


lst1 = ["何炅", "杜海海涛","周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆无敌是多磨寂寞")
print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
print(lst2) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
print(id(lst1) == id(lst2)) # False 此时列表的内存地址不同,看似和上面案例差不多,但是尝试查看嵌套列表的地址发现问题
print(id(lst1[3]) == id(lst2[3])) # True 两个列表中的嵌套列表内存地址相同。所以修改lst1,lst2中的列表也发生了变化,说明lst1在copy时候只拷贝了嵌套列表的内存地址赋予lst2

#  此时发现产生了浅拷贝. 只拷⻉第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝



## 深拷贝
import copy

lst1 = ["何炅", "杜海海涛", "周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆无敌是多磨寂寞")
print(lst1) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
print(lst2) # ['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅']]
print(id(lst1) == id(lst2)) # False
print(id(lst1[3]) == id(lst2[3])) # False 此时发现两个列表的地址和内嵌列表的地址都不同,所以修改lst1之后,lst2没有发生变化

# 都不一样了了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产生⼀个改变另⼀个跟着 改变的问题

  

原文地址:https://www.cnblogs.com/fanghongbo/p/9850625.html