python之拷贝(深浅)

深浅拷贝

深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。

数字和字符串

对于数字字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

复制代码

# 导入copy模块
>>> import copy
# 定义一个变量var1
>>> var1 = 123
# 输出var1的内存地址
>>> idvar1)
1347747440
>>> var2 = var1
# var2的内存地址和var1相同
>>> idvar2)
1347747440
# 浅拷贝
>>> var3 = copy.copyvar1)
# var3的内存地址和var1相同
>>> idvar3)
1347747440
# 深拷贝
>>> var4 = copy.deepcopyvar1)
# var4的内存地址和var1相同
>>> idvar4)
1347747440

复制代码

其他数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

创建一个字典var1

var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}

赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

复制代码

>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
>>> var2 = var1
>>> idvar1)
1937003361288
>>> idvar2)
1937003361288

复制代码

如图所示:

浅拷贝

浅拷贝,在内存中只额外创建第一层数据

复制代码

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用浅拷贝的方式
>>> var2 = copy.copyvar1)
# 两个变量的内存地址是不一样的
>>> idvar1)
2084726354952
>>> idvar2)
2084730248008
# 但是他们的元素内存地址是一样的
>>> idvar1["k1"])
2084726207464
>>> idvar2["k1"])
2084726207464

复制代码

如图所示:

深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

复制代码

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用深拷贝的方式把var1的内容拷贝给var2
>>> var2 = copy.deepcopyvar1)
# var1和var2的内存地址是不相同的
>>> idvar1)
1706383946760
>>> idvar2)
1706389852744
# var1和var2的元素"k3"内存地址是不相同的
>>> idvar1["k3"])
1706389853576
>>> idvar2["k3"])
1706389740744
# var1和var2的"k3"元素的内存地址是相同的
>>> idvar1["k3"][1])
1706383265744
>>> idvar2["k3"][1])
1706383265744

复制代码

如图所示:

 

复制代码

import copy

# 对数字 字符串
# a = 1
# b = a
#
# printida) == idb))
# b = 12
# printa, b)
# printida) == idb))


# a = 'aa'
# b = copy.copya)
# printa, b)
# printida) == idb))
#
# b = 'bb'
# printa, b)
# printida) == idb))

# c = copy.deepcopya)
# printa, c)
# printida) == idc))
#
# c = 'cc'
# printa, c)
# printida) == idc))


# a = [1, 2, 3, 4, 5]
#
# b = a
#
# b[1] = 5
# printa, b)
# printida) == idb))

#
# a = [1, 2, 3, 4, 5, [1, 2]]
# b = copy.copya)
# printa, b)
# printida) == idb))
# printida[1]) == idb[1]))
# printida[5]) == idb[5]))
# b[1] = 10
# printa[1])
# printida[1]) == idb[1]) )
#
# print'----------')
# printida[5][0]) == idb[5][0]))
# b[5][0] = 50
# printa[5][0])
# printida[5][0]) == idb[5][0]))


a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}]
b = copy.deepcopya)
printida) == idb))
printida[3]) == idb[3]))
printida[5]) == idb[5]))
# b[3] = 20
# printa, b )
printida[5][1][0][1]) == idb[5][1][0][1]))
b[5][1][0] = 20
printa[5][1][0])

优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg

Published by

风君子

独自遨游何稽首 揭天掀地慰生平