python 入门之 – 深度copy 与 数据类型内存地址(十四)

在深入了解 pythoncopy() 方法之前先回顾以前以前学过的变量赋值,如:

a = 123123
b = a
print(b)

毫无疑问,在变量中我可以直接以等于号来复制一个值出来,打印出来的是和 a 相等的值,如:123123,但是在数组中为什么用这种方法不行,最后找到了一个方法,id()

id()
id() 方法使用来查看 变量 在计算机中真实的 内存地址 的一个方法,如:

a = 123123 
b = a
print('a:',id(a))
print('b:',id(b))

结果如下:

a: 4355030992
b: 4355030992

他们两个指向的值,在计算机的内存当中是一摸一样的,现在我尝试这改变一个值:

a = 123123 
b = a
b = 423423
print('a:',id(a))
print('b:',id(b))

结果如下:

a: 4322574288
b: 4321837008

由此可见,其实每个变量本身的值是不一样的地址,但是当我们改变一个变量的时候,并不会改变上一个变量存储在计算机当中的值,所以这一类变量更改不会影响到另外的变量在计算机中存储的值。

我现在在尝试着来用数组这样复制,然后改变他的值,用 id() 方法来查看他在计算机中的值,如:

在这里插入图片描述
两个变量的内存地址是一摸一样的,然后换位思考一下,它里面每个值是不是也是一样的呢,我来打印一下看看,如:
在这里插入图片描述
由此我明白了为什么为什么我只要改变了其中一个变量数组中的值,另外一个数组也会改变了,应该改变的是数组其中一项的内存地址,而不是外面这个数组,所以外面数组的地址是同一个,因此两者关系才会保持在只要有一个发生改变了,另外一个也会发生改变。

然后我才尝试一下 copy() 这个方法:
在这里插入图片描述
由此可见,copy() 方法之所以存在,是为了把最外层的地址给换掉相当于是建立了一个新的变量,但实际上但是这个新对象里面还是原来的内存地址和数据,这样依赖,既不会浪费内存性能,也简洁了我们的开发。

其实还有一个关于 copy 的例子,例如:

a = [['a'],'b','c','d','e']
b = a.copy()
print(id(a[0]))
print(id(b[0]))

实际上我用 copy 只是单独改变了他外部变量的地址,里面的列表地址并没有改变,都是一摸一样的,如:
在这里插入图片描述
如果在这个列表里面有一个子列表,那么我用这种 copy 是改变不了子列表本身的地址的,这就要说到深度 copy 了,其实 python 中还有一个深度 copy ,这个要单独引入 python 内置的包

如果要引入其他的模块包,或者工具包,或者其他自己编写的模块,那么就要用到 import 关键字,如,我要引入 python 内置的模块包:

#引入 python 内置的模块包
import copy
a = [['a'],'b','c','d','e']
#copy 工具包里面提供了一个方法可以改变所有集合内部的集合对象的地址,但是内部的数据本身的地址不会改变
b = copy.deepcopy(a)
print(id(a[0]))
print(id(b[0]))

运行结果如下:
在这里插入图片描述
可以看到,这样就深度 copy 成功了,而且还没有更改数据本身的值,也是非常节省性能的

猜你喜欢

转载自blog.csdn.net/weixin_43704471/article/details/84205659