python 拷贝的区别

less than 1 minute read

Published:

python 中拷贝的区别。

python 中的拷贝

完全不拷贝一般发生在:

  • 1、简单的赋值操作,如 a=b
  • 2、python 函数中传递参数不会进行拷贝。

视图(浅拷贝)一般发生在:

  • 1、python 序列(如 list)的切片操作。
  • 2、numpy 的切片操作返回原数据的视图。
  • 3、调用 ndarray 的 view() 函数产生一个视图。

注:

对于 numpy 来说:

view() 方法会创建一个共享原数组数据的新的数组对象,如果数组 A 是数组 B 的视图(view),则称 B 为 A 的base(除非 B 也是视图)。视图数组中的数据实际上保存在 base 数组中。

浅拷贝只有当更改数据时才会相互影响,而更改 shape 时(数据没变)不会相互影响。

对于 list 来说:

浅拷贝没有复制整个容器对象的地址,仅复制了容器中元素的地址。

当更改数据时不会相互影响,但是使用 append() 函数时会相互影响。

副本(深拷贝)一般发生在:

  • 1、python 序列调用 deepCopy() 函数。
  • 2、调用 ndarray 的 copy() 函数产生一个副本。

操作

# ndarray
# 当进行关于赋值操作时,若希望产生副本
a = b.copy()
# 当进行关于赋值操作时,若希望产生视图
a = b.view()

# python 序列
import copy
# 当进行关于赋值操作时,若希望产生副本
a = copy.deepcopy(b)
# 当进行关于赋值操作时,若希望产生视图
a = copy.copy(b)

参考资料及致谢

NumPy:拷贝和视图

Python-copy()与deepcopy()区别

NumPy 副本和视图