这篇教程Python基础之赋值,浅拷贝,深拷贝的区别写得很实用,希望能帮到您。
一、赋值不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。
二、浅拷贝创建新对象,其内容是对原对象的引用。浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化。 浅拷贝的三种形式: # 第1种B = A[:]# 第2种B = [a for a in A] 浅拷贝要分两种情况进行讨论: 1)当浅拷贝的值是不可变对象(例如字符串、元组、数值类型)时,和赋值情况一样,对象的内存地址(id())与浅拷贝原来的值一致。 2)当浅拷贝的值是可变对象(例如列表、字典、集合等)时,也需要分两种情况讨论: 首先,原来值的内存地址与拷贝后的内存地址不同。 - 当要拷贝的对象里面,没有可变的子对象时,原来值(拷贝值)的改变并不会影响拷贝值(原来值)。
- 当要拷贝的对象里面,有可以改变的子对象时,改变该子对象,原来值和拷贝值之间会互相影响。
三、深拷贝深拷贝拷贝出来的对象是一个全新的对象,和原来的对象没有任何的关联。改变原有对象不会影响新的拷贝对象。
四、例子import copy# 不可变对象# A = (1, 2, 'hello') # 元组# A = 1 # 数值A = 'hello' # 字符串print("********赋值********")B = Aprint(id(A))print(id(B))print(A)print(B)print("********浅拷贝********")B = copy.copy(A)print(id(A))print(id(B))print(A)print(B)print("********深拷贝********")B = copy.deepcopy(A)print(id(A))print(id(B))print(A)print(B)结果: ********赋值******** 1894005658264 1894005658264 hello hello ********浅拷贝******** 1894005658264 1894005658264 hello hello ********深拷贝******** 1894005658264 1894005658264 hello hello
import copy# 可变对象A = [1, 2, 3]print("********赋值********")B = Aprint(id(A))print(id(B))print(A)print(B)print("********浅拷贝********")B = copy.copy(A)print(id(A))print(id(B))print(A)print(B)print("********深拷贝********")B = copy.deepcopy(A)print(id(A))print(id(B))print(A)print(B)结果: ********赋值******** 1602694308360 1602694308360 [1, 2, 3] [1, 2, 3] ********浅拷贝******** 1602694308360 1602694308424 [1, 2, 3] [1, 2, 3] ********深拷贝******** 1602694308360 1602950316296 [1, 2, 3] [1, 2, 3]
import copy# 可变对象A = [1, 2, 3, [11, 10, 20]]# 可变对象的外层修改B1 = A # 赋值B2 = copy.copy(A) # 浅拷贝B3 = copy.deepcopy(A) # 深拷贝A.append(4)print("********赋值********")print(id(A))print(id(B1))print(A)print(B1)print("********浅拷贝********")print(id(A))print(id(B2))print(A)print(B2)print("********深拷贝********")print(id(A))print(id(B3))print(A)print(B3)结果: ********赋值******** 2215309238856 2215309238856 [1, 2, 3, [11, 10, 20], 4] [1, 2, 3, [11, 10, 20], 4] ********浅拷贝******** 2215309238856 2215593496776 [1, 2, 3, [11, 10, 20], 4] [1, 2, 3, [11, 10, 20]] ********深拷贝******** 2215309238856 2215593518024 [1, 2, 3, [11, 10, 20], 4] [1, 2, 3, [11, 10, 20]]
import copy# 可变对象A = [1, 2, 3, [11, 10, 20]]# 可变对象的内层修改B1 = A # 赋值B2 = copy.copy(A) # 浅拷贝B3 = copy.deepcopy(A) # 深拷贝A[3].append(4)print("********赋值********")print(id(A))print(id(B1))print(A)print(B1)print("********浅拷贝********")print(id(A))print(id(B2))print(A)print(B2)print("********深拷贝********")print(id(A))print(id(B3))print(A)print(B3)结果 ********赋值******** 2288591069768 2288591069768 [1, 2, 3, [11, 10, 20, 4]] [1, 2, 3, [11, 10, 20, 4]] ********浅拷贝******** 2288591069768 2288847138760 [1, 2, 3, [11, 10, 20, 4]] [1, 2, 3, [11, 10, 20, 4]] ********深拷贝******** 2288591069768 2288847168264 [1, 2, 3, [11, 10, 20, 4]] [1, 2, 3, [11, 10, 20]]
到此这篇关于Python基础之赋值,浅拷贝,深拷贝的区别的文章就介绍到这了,更多相关Python赋值 浅拷贝 深拷贝的区别内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! python绘图subplots函数使用模板的示例代码 Django 实现jwt认证的示例 |