Python干货-Numpy浅拷贝与深拷贝

  • Post author:
  • Post category:python

# 导入numpy
import numpy as np

创建操作的数据源

a = np.arange(4)
print(a)
[0 1 2 3]

浅拷贝

b = a

print(a)
print(b)
[9 1 2 3]
[9 1 2 3]

现在a与b的值是一样的,如果此时改变a的值,b的值会发生什么情况呢?

# 改变a中第一个元素的值
a[0] = 9
print(a)
print(b)
[9 1 2 3]
[9 1 2 3]

可以看到,改变a后,b的值也跟着变了,这是为什么呢?

实际上,变量a中并没有存储任何的值,它只是指向了一个内存地址,而这个地址里存储着array具体的内容,当把a赋值给b的时候,实际上是把a指向内存中某对象的链接赋给了b,也就是说,现在a和b都指向了同一个对象。

因此,在改变了内存中array的值后,而a与b都引用了该array对象,所以都一起发生了变化

这种将内存引用赋值给另一个变量的操作叫做浅拷贝

深拷贝

那什么是深拷贝呢,其实就是在赋值的时候,不把同一个内存对象的引用赋值给另一个变量,令两个变量所指向的对象不一样,更改值的时候不相互影响,这种操作就是深拷贝

# 此时的a
print(a)
[9 9 2 3]
# 深拷贝动作
b = a.copy()
# 将a的第2个元素值也更改
a[1] = 9

print(a)
print(b)
[9 9 2 3]
[9 9 2 3]

copy()会创建a的一个副本,也就是创建一个一模一样的array对象,存储到内存的另一个地址中,然后将这个副本的地址赋值给b

如何查看对象的地址呢?如下:

print('a引用的对象的地址:', id(a))
print('b引用的对象的地址:', id(b))
a引用的对象的地址: 2238964169344
b引用的对象的地址: 2238963438656

可以看出,深拷贝后,a和b所指向的对象是不一样的,它们的内存地址不一样

再来难一下浅拷贝:

b = a
print('a引用的对象的地址:', id(a))
print('b引用的对象的地址:', id(b))
a引用的对象的地址: 2238964169344
b引用的对象的地址: 2238964169344

很明显,结果一目了然

如果相判断两个对象是不是指向同一个对象,可以用如下语句:

print(b is a)
True

结果如果为True,则说明b和a其实引用的是同一个对象

b = a.copy()
print(b is a)
False

这里,因为是深拷贝,所以b指向的对象已不再是a原来指向的对象,所以,结果是False


版权声明:本文为weixin_38486884原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。