python 浅拷贝|深拷贝
Posted 栗子姑娘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 浅拷贝|深拷贝相关的知识,希望对你有一定的参考价值。
- 数字和字符串
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
#赋值
n1 = 123
print(id(n1))
n = n1
print(id(n))
输出结果:
140721961362272
140721961362272
#浅拷贝
import copy
#数字
n1 = 123
print(id(n1))
a = copy.copy(n1)
print(id(a))
#字符串
n2 = "you are a pig"
b = copy.copy(n2)
print(id(n2))
print(id(b))
输出结果:
#数字
140721970013024
140721970013024
#字符串
1373912335728
1373912335728
#深拷贝
import copy
#数字
n1 = 123
print(id(n1))
a = copy.deepcopy(n1)
print(id(a))
#字符串
n2 = "you are a pig"
b = copy.deepcopy(n2)
print(id(n2))
print(id(b))
输出结果:
#数字
140721970013024
140721970013024
#字符串
1869362529648
1869362529648
- 其他基本数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
- 赋值:
赋值,只是创建一个变量,该变量指向原来内存地址,如:
\'\'\'赋值\'\'\'
n1 = ["you","are",["a","pig"]]
n2 = n1
print(id(n1))
print(id(n2))
输出结果:
2480562397832
2480562397832
- 浅拷贝:
对于可变对象如:列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象;大多数情况下,一个可变对象内还可以嵌套其它可变对象,此时浅拷贝只会拷贝顶级对象,而对于嵌套的对象,只会复制它的引用,所以修改顶级对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象。
\'\'\'复制(浅拷贝)\'\'\'
import copy
n1 = ["you","are",["a","pig"]]
n3 =copy.copy(n1)
n1[2][1] = "BIG_PIG"
print(n1)
print(id(n1))
print(n3)
print(id(n3))
输出结果:
[\'you\', \'are\', [\'a\', \'BIG_PIG\']]
1614775337864
[\'you\', \'are\', [\'a\', \'BIG_PIG\']]
1614775224776
由结果可知,浅拷贝只拷贝第一层的元素。
- 深拷贝:
深拷贝就是将顶级对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。
\'\'\'深拷贝\'\'\'
import copy
n1 = ["you","are",["a","pig"]]
n3 =copy.deepcopy(n1)
n1[2][1] = "BIG_PIG"
print(n1)
print(id(n1))
print(n3)
print(id(n3))
输出结果:
[\'you\', \'are\', [\'a\', \'BIG_PIG\']]
2350443541576
[\'you\', \'are\', [\'a\', \'pig\']]
2350443432712
由结果可知,深拷贝是拷贝最深层的元素。
以上是关于python 浅拷贝|深拷贝的主要内容,如果未能解决你的问题,请参考以下文章