python赋值,深拷贝和浅拷贝的区别

1.赋值

 

list1=[[1,2],'fei',66]
list2=list1
list1
[[1, 2], 'fei', 66]
list2
[[1, 2], 'fei', 66]
list2.append(77)
list2
[[1, 2], 'fei', 66, 77]
list1
[[1, 2], 'fei', 66, 77]
id(list1),id(list2)
(72624608, 72624608)

 

总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加

 

 

2.浅拷贝

使用的方法:copy.copy()

代码示例:

>>> import copy
>>> list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> print(id(list1))
55713024
>>> print(id(list2))
55712864
>>> print(id(list1[0]),'\n',id(list2[0]))
55712184 
 55712184
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040 
 61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240 
 2057136240

#总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的

>>>list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> list1
[[1, 2], 'fei', 66]
>>> list2
[[1, 2], 'fei', 66]
>>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list2
[[11, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list2
[[11, 2], 'fei', 66]

#总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)

最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝

 

3.深拷贝

使用的方法:copy.deepcopy()

代码示例:

>>> list1=[[1,2],'fei',66]
>>> list3=copy.deepcopy(list1)
>>> print(id(list1),'\n',id(list2))
62055888 
 55713624
>>> print(id(list1[0]),'\n',id(list2[0]))
55726368 
 55713704
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040 
 61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240 
 2057136240

#总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样

>>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> id(list1[1])
62058944
>>> id(list3[1])
61987040

#总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化

最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)

 

posted @ 2020-05-06 16:39  pple  阅读(284)  评论(0编辑  收藏  举报
以终为始,你期待的那天不会太遥远。