我要学python之深浅拷贝原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我要学python之深浅拷贝原理相关的知识,希望对你有一定的参考价值。

前言

在c++中参数传递有两种形式:值传递和引用传递。这两种方式的区别我不在此说,自行补上,如果你不知道的话。我先上python代码,看完我们总结一下,代码如下:

# copy module import
import copy

# number and string
a = 12
a1 = a
a2 = copy.copy(a)
a3 = copy.deepcopy(a)
# look addr
print("==========number=======")
print(id(a))
print(id(a1))
print(id(a2))
print(id(a3))

s = ‘12345‘
s1 = s
s2 = copy.copy(s)
s3 = copy.deepcopy(s)
# look addr
print("==========String=======")
print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))

# others
target = {
    ‘name‘: ‘ckmike‘,
    ‘age‘: 25,
    ‘boxes‘:[
        ‘LV‘,
        ‘Prada‘,
        ‘KUQI‘
    ]
}
target1 = target
target2 = copy.copy(target)
target3 = copy.deepcopy(target)
print("==========dict-1=======")
print(id(target))
print(id(target1))
print(id(target2))
print(id(target3))
print("==========dict-2=======")
print(id(target[‘boxes‘]))
print(id(target1[‘boxes‘]))
print(id(target2[‘boxes‘]))
print(id(target3[‘boxes‘]))

输出结果:
==========number=======
10943360
10943360
10943360
10943360
==========String=======
140567123944648
140567123944648
140567123944648
140567123944648
==========dict-1=======
140567124625088
140567124625088
140567124625160
140567123938760
==========dict-2=======
140567099339272
140567099339272
140567099339272
140567099339464

总结:
对于数值、字符串而言,不管是赋值符号还是浅拷贝、深拷贝,都是引用的内存中的同一份值,变量指向同一地址。
对于非数值非字符串而言,浅拷贝只会拷贝对象的第一层,深拷贝则会把所有层都进行拷贝。

具体深浅拷贝,可以查看模块copy中的copy和deepcopy源码

以上是关于我要学python之深浅拷贝原理的主要内容,如果未能解决你的问题,请参考以下文章

python学习之深浅拷贝

Python数据结构之----数据存储与深浅拷贝

python学习之深浅拷贝

python之深浅拷贝(基础四)

Python基础之小数据池及深浅拷贝

python之set集合深浅拷贝