赋值语句 变量的地址相关 : RUNOOB python练习题7

本文通过实例探讨了Python中赋值语句与`numpy`数组复制的区别,解释了直接赋值会导致两个变量共享内存,而`np.copy()`或切片复制则会产生新的内存副本,避免了数据的直接关联修改。

用来练手的python 练习题,原链接 : python练习实例7

练习实例7非常的简单也有意思。题干 : 将一个列表的数据复制到另一个列表中。

完成这个操作的代码非常简单,即使是我这样的初学者应该也是一语道破,赋值语句嘛。但这里我们就列举出几种不同的赋值方法,其背后的逻辑和细节其实是大不相同的。

下面放出源代码,首先当然是使用我们的赋值语句进行数据复制了,这里我使用的是numpy array代替list :

import numpy as np
a = np.array([1,2,3,4,5])
c = a
print(c)
print(a)
print(c is a)
print(id(c))
print(id(a))

输出结果如下 :
在这里插入图片描述
我们不难发现,当我们使用赋值语句 “=” 直接对numpy 矩阵进行复制时,实际我们是让c与a指向了同一块内存。a和c不仅数值一致,他们在内存中对应的地址也是一样的。那么我们对a进行一些操作,看看会有什么发生呢:

a -= 1
print(a)
print(c)
print(c is a)
print(id(a))
print(id(c))

这里我们对a进行自增(自增和自减操作一样),输出结果如下:
在这里插入图片描述
我们发现,当对变量进行自增或自减操作时,变量的地址并没有改变,相应的,两个指向同一内存块的变量a和c的值当然同时改变了。

那么如果我们对a进行减法运算会发生什么呢,代码如下:

a = a - 1
print(a)
print(c)
print(c is a)
print(id(a))
print(id(c))

这次我们对矩阵a进行减法运算,输出结果如下:
在这里插入图片描述
不难发现,当我们运算 a = a − 1 a =a -1 a=a1时,python为新的变量a重新分配了内存,自然而然地,a矩阵和c矩阵就不再对应同一个内存地址了。

我们尝试了使用赋值语句进行复制,那么如果我们使用np.copy()方法会怎么样呢?
源代码如下:

f = np.copy(a)
print(f)
print(a)
print(a is f)
print(id(a))
print(id(f))

输出结果如下:
在这里插入图片描述
我们发现,使用copy方法进行复制时,仅仅只是对数值的复制,Python会为变量重新分配内存,而不会像赋值语句一样使两个变量公用同一块内存空间

使用下述代码也可以实现copy一样的作用,只复制数值,而不改变变量的地址:

g = a[:]
print(g)
print(a)
print(a is g)
print(id(a))
print(id(g))

输出结果:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值