全栈开发六 深浅拷贝
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]]
以上是关于全栈开发六 深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章