Python的赋值逻辑

相信学过Python的人都遇到过类似于下面的问题:

#Solution 01
a=[1,2]
b=a
b[1]=0
print(a)
Outpot:
[1,0]
#solution 02
a=[1,2]
b=a
b=[0,1]
print(a)
Output:
[1,2]

两种情况都是用变量b去承接了变量a的值,然后修改b的值,但是Solution 01情况下a的值改变了,但是Solution 02情况下a的值却没有改变,这是为什么呢?
出现这种情况的原因主要是因为变量地址发生了变化,我们可以用Python自带的id()函数来看看变量的地址变化情况。

#Solution 01
a=[1,2]
b=a
print(id(a) == id(b))
b[1]=0
print(id(a) == id(b))
Output:
True
True
#solution 02
a=[1,2]
b=a
print(id(a) == id(b))
b=[0,1]
print(id(a) == id(b))
Output:
True
False

我们可以看到,Solution 01 情况下,改变b后a的值改变了,并且操作前后b和a的地址始终相同;但是在Solution 02情况下,改变b后a的值并未改变,且b的地址变得和a不一样了,这说明,在给b赋了新值后,b就指向了不同的地址,但为什么Solution 01情况下b没有指向新的地址呢?
我们仔细看Solution 01情况下的操作,b[1]=0,实际上这个操作只是改变了b所指向地址的一部分,也就是说这个操作并未从根本上给b赋值新的对象。那能不能说用b[0] = 1,b[1] = 2,这两条语句来改变b的地址呢?答案是否定的,因为每一句话都未从根本上给b赋值新的对象,也就不存在更改地址这一说了。
上述过程可以参考下图:
在这里插入图片描述
上述的python赋值逻辑和我们以前学过的c语言的赋值逻辑是有差异的:
C语言中变量赋值不同前后的地址变化:

//C语言中变量赋值不同前后的地址变化:
#include<stdio.h>

void main(void){
	int a = 2;
	printf("address of a is %d\n",&a);
	a = 23;
	printf("address of a is %d\n",&a);
}

输出结果:

Output:
address of a is 1310524
address of a is 1310524

我们发现C语言变量在赋值前后,地址没有变化,这说明C语言是在变量的内存地址上修改变脸改的值,然后在覆盖变量之前的值,从上述python的赋值逻辑可知,当变量从根本上赋值新的对象后,变量的地址会改变,指向新的对象地址,原来的值的地址仍然存在。总结:c语言中是新值覆盖旧值,python是指向新值,旧值仍然存在,至于旧值之后会如何处理,今后有时间笔者在和大家讨论。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值