python中深copy,浅copy

  1. >>> mylist1 = [1, 2, 3, 4]  
  2. >>> myl = mylist1  
  3. >>> myl  
  4. [1, 2, 3, 4]  
  5. >>> mylist1[0] = 5  
  6. >>> mylist1  
  7. [5, 2, 3, 4]  
  8. >>> myl  
  9. [5, 2, 3, 4]  
>>> mylist1 = [1, 2, 3, 4]
>>> myl = mylist1
>>> myl
[1, 2, 3, 4]
>>> mylist1[0] = 5
>>> mylist1
[5, 2, 3, 4]
>>> myl
[5, 2, 3, 4]

这个就是浅复制

浅复制仅仅只是复制了对对象的引用,即 mylist1 和 myl 指向的是同一个对象,所以如果改变了该对象的元素的话,则 mylist1 和 myl 所指向的对象都会改变,因为实际上就是同一个对象

 

  1. >>> id(mylist1)  
  2. 202009976  
  3. >>> id(myl)  
  4. 202009976  
>>> id(mylist1)
202009976
>>> id(myl)
202009976
可以看出两者指向的对象在内存中的地址是相同的,即是同一个对象

 

 

  1. >>> import copy  
  2. >>> mylist2 = [5, 6, 7, 8]  
  3. >>> myl2 = copy.deepcopy(mylist2)  
  4. >>> mylist2[0] = 9  
  5. >>> mylist2  
  6. [9, 6, 7, 8]  
  7. >>> myl2  
  8. [5, 6, 7, 8]  
>>> import copy
>>> mylist2 = [5, 6, 7, 8]
>>> myl2 = copy.deepcopy(mylist2)
>>> mylist2[0] = 9
>>> mylist2
[9, 6, 7, 8]
>>> myl2
[5, 6, 7, 8]
这个就是深复制

 

 

  1. >>> id(mylist2)  
  2. 200662512  
  3. >>> id(myl2)  
  4. 202007336  
>>> id(mylist2)
200662512
>>> id(myl2)
202007336
而深复制后的两个变量则指向的是两个不同的对象,可以把这两个对象理解为张得一模一样的双胞胎,虽然很像,但实际上是两个不同的人,所以其中一个人发生了改变(如受伤了)也不会影响到另一个人

 

 

  1. >>> id(mylist3[0])  
  2. 30909144  
  3. >>> id(myl3[0])  
  4. 30909144  
  5. >>> id(mylist3[3])  
  6. 200634696  
  7. >>> id(myl3[3])  
  8. 202008136  
  9. >>> mylist3 = [1, "a", 3, [4, 5, 6], [[7, 8, 9]]]  
  10. >>> myl3 = copy.deepcopy(mylist3)  
  11. >>> id(mylist3[1])  
  12. 31110016  
  13. >>> id(myl3[1])  
  14. 31110016  
>>> id(mylist3[0])
30909144
>>> id(myl3[0])
30909144
>>> id(mylist3[3])
200634696
>>> id(myl3[3])
202008136
>>> mylist3 = [1, "a", 3, [4, 5, 6], [[7, 8, 9]]]
>>> myl3 = copy.deepcopy(mylist3)
>>> id(mylist3[1])
31110016
>>> id(myl3[1])
31110016
但是如果 mylist3 和 myl3 的元素指向的是同一个 『不可变』 的对象时,则 他们指向的仍然是同一个对象, 如 1 和 "a"
posted on 2017-07-16 20:37  momo8238  阅读(181)  评论(0编辑  收藏  举报