对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
列表赋值:
>>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3]
解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变
如果希望b不改变,可以用到切片
>>> b = a[:] >>> a[0] = 0 >>> print b [1, 2, 3]
解释,切片a[:]会产生一个新的对象,占用一块新的内存,b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b
列表深拷贝和浅拷贝
浅拷贝
>>> import copy >>> a = [1, 2, 3, [5, 6]] >>> b = copy.copy(a) >>> print b [1, 2, 3, [5, 6]] >>> a[3].append('c') >>> print b [1, 2, 3, [5, 6, 'c']]
深拷贝
>>> a = [1, 2, 3, [5, 6]] >>> b = copy.deepcopy(a) >>> a[3].append('c') >>> print b [1, 2, 3, [5, 6]]
拷贝即是开辟一块新的内存空间,把被拷贝对象中的值复制过去。而浅拷贝并没有为子对象[5,6]开辟一块新的内存空间,而仅仅是实现对a中[5,6]的引用。所以改变a中[5,6]的值,b中的值也会发生变化。
深拷贝则是为子对象也开辟了一块新空间。所以改变a中[5, 6]的值,并不影响b
数组赋值不能用切片来达到相同的目的
>>> import numpy as np >>> a = np.array([1, 2 ,3]) >>> b = a[:] >>> a[0] = 5 >>> print a, b [5 2 3] [5 2 3]
如上,虽然用切片,但不能达到修改a而不影响b的目的。说明a,b仍然指向同一块内存。
此时,只能用拷贝
>>> b = a.copy() >>> a[0] = 5 >>> print a, b [5 2 3] [1 2 3]
此时修改a不会影响到b。其中的原因以后进一步深究。
注意,列表的拷贝是copy.copy(obj)或copy.deepcopy(obj),数组的拷贝是obj.copy()
相关推荐
坚持是一种品质 2020-11-16
zhaobig 2020-11-16
文山羊 2020-10-31
kikaylee 2020-10-31
oXiaoChong 2020-10-30
PYTandFA 2020-09-15
CloudStrife0 2020-08-23
hang0 2020-08-16
lzujiangge 2020-08-16
RocNg 2020-08-15
xiesheng 2020-08-06
Tristahong 2020-08-05
georgeandgeorge 2020-08-03
elizabethxxy 2020-07-27
flycony 2020-07-05
柠檬班 2020-07-04
magicandy 2020-07-04
fanhuasijin 2020-06-27