栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python-深拷贝,浅拷贝

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python-深拷贝,浅拷贝

1.数据类型

变量 = xxx 仅代表把变量指向xxx数据所在的存储空间。

比如a = [1,2,3]代表变量a指向[1,2,3]所在的存储空间。

python有两种数据类型:可变数据类型,不可变数据类型。区别在于内存中的值能否被修改。

id(变量)可以查看变量的内存地址。

1.1 可变数据类型:列表,字典(key不可变)

列表:

# 列表
# 修改列表中的值,a变量的指向没有发生改变(可变数据类型)
a = [1,2,3]
print(id(a))  # 1949733739136
a.append(4)
print(id(a))  # 1949733739136

字典:

# 字典
# 修改字典中的值,a变量的指向没有发生改变(可变数据类型)
a = dict(name="zs", age=27)
print(id(a))  # 2955544943680
a["sex"] = "male"
print(id(a))  # 2955544943680
1.2 不可变数据类型:数字,字符串,元组

数字:

# 数字
# 修改数字的值,a变量的指向发生改变(不可变数据类型)
a = 2
print(id(a))  # 140716966876864
a = 3
print(id(a))  # 140716966876896

字符串:

# 字符串
# 修改字符串的值,a变量的指向发生改变(不可变数据类型)
a = "python"
print(id(a))  # 2546802488816
a = "javascript"
print(id(a))  # 2546802807088

元组:

# 元组
# 无法修改元组的值(不可变数据类型)
a = (1,2,3)
a[0] = 0  # 会报错,元组不可变
2.拷贝可变类型数据 2.1 copy.copy(浅拷贝)

浅拷贝创建了新的内存空间:

import copy

a = [1,2,3]
b = copy.copy(a)
print(id(a))  # 1977249421888
print(id(b))  # 1977249419712


因为是两个不同的内存空间,所以即使我们改变了a中的数据,b中的数据也不会发生改变:

import copy

a = [1,2,3]
b = copy.copy(a)
a[0] = 0
print(a)  # [0, 2, 3]
print(b)  # [1, 2, 3]

2.2 copy.deepcopy(深拷贝)

深拷贝创建了新的内存空间:

import copy

a = [1,2,3]
b = copy.deepcopy(a)
print(id(a))  # 2077998963392
print(id(b))  # 2077998961280


因为是两个不同的内存空间,所以即使我们改变了a中的数据,b中的数据也不会发生改变:

import copy

a = [1,2,3]
b = copy.deepcopy(a)
a[0] = 0
print(a)  # [0, 2, 3]
print(b)  # [1, 2, 3]

2.3 总结

对于可变类型数据,copy.copy与copy.deepcopy都会重新创建新的内存空间。两者的区别体现在有子对象的情况。

  • copy.copy不会为子对象创建新的内存空间。
  • copy.deepcopy会为子对象创建新的内存空间。

2.3.1 copy.copy复制的子对象仍然会指向原来的子对象

import copy

a = [1,2,[3,4,5]]
b = copy.copy(a)
print(id(a[2]))  # 1690960124544
print(id(b[2]))  # 1690960124544


所以当我们修改a中的子对象时,b中的子对象也会发生改变

import copy

a = [1,2,[3,4,5]]
b = copy.copy(a)
a[2].append(6)
print(a[2])  # [3, 4, 5, 6]
print(b[2])  # [3, 4, 5, 6]


2.3.2 copy.deepcopy复制的子对象也会创建新的内存空间

import copy

a = [1,2,[3,4,5]]
b = copy.deepcopy(a)
print(id(a[2]))  # 2268926565056
print(id(b[2]))  # 2268926767808


所以当我们修改a中的子对象时,b中的子对象不会发生改变

import copy

a = [1,2,[3,4,5]]
b = copy.deepcopy(a)
a[2].append(6)
print(a[2])  # [3, 4, 5, 6]
print(b[2])  # [3, 4, 5]

3.拷贝不可变类型数据 3.1 copy.copy(浅拷贝)

浅拷贝指向同一个内存空间

import copy

a = 1
b = copy.copy(a)
print(id(a))  # 140716966876832
print(id(b))  # 140716966876832


当我们修改a的值,a的指向发生改变,b中的值不变

import copy

a = 1
b = copy.copy(a)
a = 5
print(a)  # 5
print(b)  # 1

3.2 copy.deepcopy(深拷贝)

深拷贝指向同一个内存空间

import copy

a = 1
b = copy.deepcopy(a)
print(id(a))  # 140716966876832
print(id(b))  # 140716966876832


当我们修改a的值,a的指向发生改变,b中的值不变

import copy

a = 1
b = copy.copy(a)
a = 5
print(a)  # 5
print(b)  # 1

3.3 总结

对于不可变类型数据,copy.copy与copy.deepcopy均指向同一内存空间。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350337.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号