#!/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没有发生变化 # 都不一样了了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产生⼀个改变另⼀个跟着 改变的问题