agangliu0400 发表于 2018-8-13 07:15:06

python之浅拷贝与深拷贝

1. 浅拷贝
  浅拷贝是对于一个对象的顶层拷贝
  通俗的理解是:拷贝了引用,并没有拷贝内容
  

In : a =   

  
In : b = a
  


  
In :>  
Out: 140343572333832
  


  
In :>  
Out: 140343572333832
  

  
In : a = 'aa'
  

  
In : a
  
Out: ['aa', 22, 33]
  

  
In : b
  
Out: ['aa', 22, 33]
  

  

  当b = a时,实际上是将a列表的内存地址赋值给了b,那么变量a与变量b指向的是同一内存地址!

2. 深拷贝
  深拷贝是对于一个对象所有层次的拷贝(递归)
  

In : import copy  

  
In : c = copy.deepcopy(a)
  


  
In :>  
Out: 140343572333832
  


  
In :>  
Out: 140343572336840
  

  
In : a
  
Out: ['aa', 22, 33]
  

  
In : c
  
Out: ['aa', 22, 33]
  

  
In : a = 11
  

  
In : a
  
Out:
  

  
In : c
  
Out: ['aa', 22, 33]
  

  

  深拷贝不仅拷贝引用还拷贝值,所以内存地址不一样!
  再看下面的代码,进一步理解浅拷贝与深拷贝:

  注意:变量e由于用的是深拷贝,所以引用与值都是独立的一份

copy.copy
  上面演示了copy.deepcopy的用法,下面看copy.copy的用法:
  

In : a =   

  
In : b =
  

  
In : c =
  

  
In : e = copy.copy(c)
  

  
In : a.append(4)
  

  
In : c
  
Out:
  


  
In :>  
Out: 140343572344200
  


  
In :>  
Out: 140343588052232
  

  

  图解:

  由于变量e用的是copy.copy(c)的方法,所以只拷贝了列表的引用(copy.copy只能拷贝第一层引用),所以变量c与变量e的内存地址是不同的,但当改变列表中a列表的值时,发现e变量中的a列表也会改变,说明copy.copy方法只拷贝了列表列表的引用,而没有拷贝列表中列表a与列表b的引用。实际上列表中的两个列表a,b的内存地址还是指向的a与b

copy元组时的特点

  copy.copy方法在copy时会自动判断copy的对象是可变类型还是不可变类型,如果是不可变类型,那么直接将引用指向copy的对象,如果是可变类型,那么只拷贝第一层的引用,后面的引用不会拷贝
页: [1]
查看完整版本: python之浅拷贝与深拷贝