python 浅谈直接赋值、浅拷贝和深拷贝

直接赋值:其实就是对象的引用,或者说是该对对象的另一个别名。

浅拷贝copy():只是对父对象的拷贝,子对象依然只是引用没有拷贝。

深拷贝deepcopy():对一个对象的完全拷贝。

 

接下来我们看看下面这个例子:

 1 >>> a=[1,2,3,['a','b']] #原始列表
 2 >>> b=a  #直接赋值
 3 >>> c=copy(a)  #浅拷贝
 4 >>> d=deepcopy(a)  #深拷贝
 5 >>> a.append(4)  #在原始列表上添加元素
 6 >>> a[3].append('c') #在原始列表的子对象(子列表)添加元素
 7 >>>
 8 
 9 #各变量的值
10 >>> a
11 [1, 2, 3, ['a', 'b', 'c'], 4]
12 >>> b
13 [1, 2, 3, ['a', 'b', 'c'], 4]
14 >>> c
15 [1, 2, 3, ['a', 'b', 'c']]
16 >>> d
17 [1, 2, 3, ['a', 'b']]
18 
19 #各变量的id
20 >>> id(a),id(a[3])
21 (1971101283720, 1971101282504)
22 >>> id(b),id(b[3])
23 (1971101283720, 1971101282504)
24 >>> id(c),id(c[3])
25 (1971101268360, 1971101282504)
26 >>> id(d),id(d[3])
27 (1971101268616, 1971101285768)
28 >>>

 结合概念我们来分析一下上面的例子:

 (1)直接赋值

  由上面的例子很明显b受a的影响,随着a的变化。从b的id可以看出b和a都指向同一个对象。

  

 

 (2)浅拷贝

  由C的值看出外层列表的改变c并没有随着改变,但是内层的列表却发生改变。结合列表c的id,可以看出外层列表id并不相同,但是内层列表却只想同一个。

  

 

(3)深拷贝

  d列表完全没有发生变化,同时外层和内层列表的id均与a不相同

  

 

posted @ 2018-12-13 22:36  小夏02  阅读(144)  评论(0)    收藏  举报