python 拷贝的区别
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)