Python列表和数组的赋值问题

Posted by Xiphoray on Nov 7, 2017

直接赋值会出现以下情况:

	>>>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 也随之改变

  • 列表深拷贝和浅拷贝

浅拷贝

	>>> 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()




Share