深浅copy

Posted shawnhuang

tags:

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

. 赋值运算
 1 s1 = [1, 2, 3, ["barry", "alex"]]
 2 s2 = s1
 3 
 4 s1[0] = 111
 5 print(s1)    # [111, 2, 3, [barry, alex]]
 6 print(s2)    # [111, 2, 3, [barry, alex]]
 7 
 8 s1[3][0] = "abc"
 9 print(s1)    # [111, 2, 3, [abc, alex]]
10 print(s2)    # [111, 2, 3, [abc, alex]]
11 
12 s2[1] = "askj"
13 print(s1)    # [111, askj, 3, [abc, alex]]
14 print(s2)    # [111, askj, 3, [abc, alex]]
15 
16 # 由上面两个示例得知, 两个列表指向的是同一个内存地址
17 # 所以它们是完全一样的,其中一个列表内元素的改变会导致另一个列表的改变

. 浅拷贝 copy
 1 s3 = [1, "拷贝", True, (1, 2, 3), [123, "ak"]]
 2 s4 = s3.copy()
 3 
 4 print(id(s3), id(s4))
 5 # 2862385252936  2862385260296
 6 
 7 print(id(s3[1]), id(s4[1]))
 8 # 2862384610800  2862384610800
 9 
10 print(id(s3[-1])), id(s4[-1])
11 # 2862385259720  2862385259720
12 
13 print(id(s3[-2])), id(s4[-2])
14 # 2862385086400  2862385086400
15 
16 # 发现列表 s3 和 s4 在内存中指向不同的地址
17 # 但是它们同一个索引位置的元素指向内存中同一个地址
18 # 说明新列表中的元素与原列表中的元素是公用的

 

  . 深拷贝 deepcopy

 1 import copy
 2 
 3 s5 = [3, True, "ask", (1, 2, 3), [34, "as"]]
 4 s6 = copy.deepcopy(s5)
 5 
 6 print(id(s5), id(s6))  
 7 # 2862386662664  2862386819848
 8 
 9 print(id(s5[0]), id(s6[0]))  
10 # 1409182528  1409182528
11 
12 print(id(s5[-1]), id(s6[-1]))  
13 # 2862386662600  2862386819912
14 
15 print(id(s5[-2]), id(s6[-2]))  
16 # 2862385217680  2862385217680
17 
18 # 对于深copy,列表是在内存中重新创建的。
19 # 列表中可变的数据类型是重新创建的,列表中的不可变数据类型是公用的

 


以上是关于深浅copy的主要内容,如果未能解决你的问题,请参考以下文章

Python深浅拷贝

python-深浅拷贝

深浅拷贝,深浅赋值语句

Python的深浅copy

《关于JavaScript的深浅拷贝》

01 深浅copy