失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python语言的基本数据类型_python语言基本数据类型-深浅拷贝

python语言的基本数据类型_python语言基本数据类型-深浅拷贝

时间:2024-03-22 07:52:57

相关推荐

python语言的基本数据类型_python语言基本数据类型-深浅拷贝

.赋值深浅复制

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语言基本数据类型-深浅拷贝》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。