全栈开发六 深浅拷贝

Posted wallacewang

tags:

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

深浅拷贝

深浅拷贝的前提:  

  • 相等和相同的关系
  • 深浅拷贝针对的是列表等可变的数据类型。
  • 深浅拷贝在普通的列表没有什么意义,只有在嵌套列表,或其他嵌套数据类型才有意义。
 1 a = "aaa"
 2 a1 = "aaa"
 3 b = a
 4 print(a == a1)
 5 print(id(a),id(a1),id(b))   #都一样
 6 print(a == b)
 7 
 8 c = [1,2,3]
 9 c1 = [1,2,3]
10 d = c
11 print(c == c1)
12 print(id(c),id(c1),id(d))   #c1不一样
13 print(c == d)

 

字符串没有copy方法:

1 # st = "aaa"
2 # st2 = st.copy()  会报错,str没有copy方法

普通列表拷贝就是生成一个新的列表,两者值形同,但id不同,且更改其中一个列表的值不影响另一列表的值:

1 #普通列表拷贝
2 li = ["a",1,2]
3 li2 = li.copy()
4 print(li == li2)   #True
5 print(li is li2)   #False
6 print(id(li),id(li2))  #id不同
7 li[0] = 1
8 print(li)    #li的改变不会更改li2的值,因为两者指的是不同的对象
9 print(li2)

嵌套列表浅拷贝,两者值相同,id不同,更改非嵌套的值不影响另一列表,更改嵌套列表的值会影响另一列表。

 1 li3 = [1,2,[3,4]]
 2 li4 = li3.copy()
 3 print(li3 == li4)    #True
 4 print(li3 is li4)    #False
 5 print(id(li3),id(li4))  #id不同
 6 
 7 li3[0] = 3
 8 print(li3)    #更改非嵌套列表的元素,不会更改li4的值
 9 print(li4)
10 
11 li3[2][0] = 2
12 print(li3)    #修改嵌套列表的值,会改变li4的值
13 print(li4)

深拷贝嵌套列表,两者值相同,id不同,更改列表的值,都不会影响另一列表,即两者完全不相干。

1 li5 = copy.deepcopy(li3)  
2 li5[2][0] = 5
3 print(li5)  #[1,2,[5,4]
4 print(li3)  #[1,2,[3,4]]

 

以上是关于全栈开发六 深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

10Python全栈之路系列之深浅拷贝标准库系列之datetime模块

python全栈闯关--7-基础数据类型汇总集合深浅拷贝

六.深浅copy

Python全栈开发之目录

python全栈开发目录

Python全栈开发学习笔记-03.第三天