.赋值深浅复制
1.字符串(数字):在内存中是一次性创建的,不能直接修改,如需修改,需要重新创建2.列表等可修改的数据类型:在内存中创建时是以链表的形式创建3.字符串、数字:赋值、深浅拷贝都没有意义,因为其永远指向同一个内存地址
定义如下列表:
li = [1, 2, 3]
l2 = [‘a’, li]
浅复制:
l3 = l2.copy()
深复制:
import copy
l4 = copy.deepcopy(l2)
图1 赋值
k1、k2、k3是第一层,k3下一层的0、1是第二层
图2 浅拷贝
图3 深拷贝
实例
# 赋值:只是创建一个变量,该变量指向原来的内存地址
n1 = {"k1": 'fei', "k2": 1235, "k3": ["fly", 19]}
n2 = n1 # 赋值
n1["k1"] = "刘波奇" # 修改第一层k1
print(n1)
print(n2)
n1["k3"][0] = "李日纯" # 通过下标0,修改第二层k3
print(n1)
print(n2)
输出结果:
{'k1': '刘波奇', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': '刘波奇', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': '刘波奇', 'k2': 1235, 'k3': ['李日纯', 19]}
{'k1': '刘波奇', 'k2': 1235, 'k3': ['李日纯', 19]}
# 浅复制:在内存中只额外的创建第一层数据
import copy #导入copy 模块
n1 = {"k1": 'fei', "k2": 1235, "k3": ["fly", 19]}
n3 = copy.copy(n1)
n1["k1"] = "张月兰"
print(n1)
print(n3)
n1["k3"][0] = "陈马斯"
print(n1)
print(n3)
结果:
{'k1': '张月兰', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': 'fei', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': '张月兰', 'k2': 1235, 'k3': ['陈马斯', 19]}
{'k1': 'fei', 'k2': 1235, 'k3': ['陈马斯', 19]}
可以看出当浅拷贝时,改变新的字典时,原来的字典的值也会改变也就是说对于浅拷贝,内存两个变量下值的内存地址是相同的
# 深拷贝
import copy #导入copy 模块
n1 = {"k1": 'fei', "k2": 1235, "k3": ["fly", 19]}
n4 = copy.deepcopy(n1)
n1["k1"] = "黄依馨"
print(n1)
print(n4)
n1["k3"][0] = "杨艺衡"
print(n1)
print(n4)
结果:
{'k1': '黄依馨', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': 'fei', 'k2': 1235, 'k3': ['fly', 19]}
{'k1': '黄依馨', 'k2': 1235, 'k3': ['杨艺衡', 19]}
{'k1': 'fei', 'k2': 1235, 'k3': ['fly', 19]}
对于深拷贝而言,只是值相等,但是内存地址是不同的,改变新的字典中的值,原来字典中的值是不会变化的。
总结:
1:对于不可变对象(如数字或者是字符串),无论是深拷贝还是浅拷贝,内存地址和值都是相同的,没有意义;
2:对于可变的对象,如列表元组,字典类型的:
浅拷贝:值和地址都是相同的
深拷贝:值相同,地址不同
如果觉得《python语言的基本数据类型_python语言基本数据类型-深浅拷贝》对你有帮助,请点赞、收藏,并留下你的观点哦!