深拷贝和浅拷贝一直是python应聘岗位必考题之一,要想理解透彻,还是要写个实际例子从== 和 is进行分析。

深拷贝和浅拷贝的用法:

语法:

  浅拷贝:copy.copy()       

  深拷贝:copy.deepcopy()

赋值操作:=

一。首先进入python命令行模式或者交互模式:

  python/python3     ipython/ipython3

二。导入copy

  import copy

三。写个小例子

>>> import copy
>>> a = [1,2,'hello',[1,2]]

>>> b1 = a  # 赋值操作的b1
>>> id(a)
140694383590144
>>> id(b1)
140694383590144
# 可见赋值操作 内存地址一样

>>> b2 = copy.copy(a) # 浅拷贝的b2
>>> b2
[1, 2, 'hello', [1, 2]]  
>>> id(b2)
140694383742920
# 可见浅拷贝内容一样,内存地址不一样

>>> b3 = copy.deepcopy(a) # 深拷贝的b3
>>> b3
[1, 2, 'hello', [1, 2]]
>>> id(b3)
140694383667896
# 可见深拷贝内容一样,内存地址不一样

>>> a is b1
True
>>> a is b2
False
>>> a is b3
False
# 可见赋值的内存地址一样;无论深拷贝,还是浅拷贝内存地址都是不一样的

>>> a[0] = 2
>>> a[-1].append(0)
# 此时开始改变a原数据-----注意是改变原数据,不是新增东西
>>> a
[2, 2, 'hello', [1, 2, 0]]
>>> b1
[2, 2, 'hello', [1, 2, 0]]
>>> b2
[1, 2, 'hello', [1, 2, 0]]
>>> b3
[1, 2, 'hello', [1, 2]]
# 可见只有深拷贝不跟大部队走,保持一开始的数据

>>> a.append(5)
>>> a
[2, 2, 'hello', [1, 2, 0], 5]
# 现在是改变原有数据,新增一个元素
>>> b1
[2, 2, 'hello', [1, 2, 0], 5]
# 赋值操作,内容依旧跟着变化
>>> b2
[1, 2, 'hello', [1, 2, 0]]
# 此时,浅拷贝的b2并没有跟着大部队走了,还是保持原有(第二次的变化)的4个元素,没有新增第五个元素
>>> b3
[1, 2, 'hello', [1, 2]]
# 深拷贝的b3,自始至终没有改变

四。总结以下几点:

- 赋值:内容一样,内存地址一样
- 浅拷贝:生成一个新对象,开辟新的内存空间,数据为原数据的引用,如a=[1,2,'he',[1,2]] 如果a append在最后加一个数据是就变成新的数据,就不是原数据,所以浅拷贝的b数据不变,如果是在原数据基础上如把a[0]位置变为5,浅拷贝的b也会变化
- 深拷贝:生成一个新对象,开辟一个新的内存空间,数据为原数据,一旦原数据a有变化与深拷贝的c毫无关系

 

posted on 2018-03-23 19:18  落叶虽美只活一世  阅读(1364)  评论(0编辑  收藏  举报
Live2D