python变量赋值踩坑记录

我们都知道python有深拷贝和浅拷贝,但变量赋值又是什么机制呢?这是个容易被忽略却又极易踩坑的点,我们来一探究竟。

先说结论:

变量赋值属于浅拷贝(关于深拷贝和浅拷贝的区别可以自己了解下)。故如果是可变类型变量(如a是list类型,a=b)赋值,修改a会牵连到b;如果是不可变类型(如int)的赋值,则修改任意变量不会传递。

1. 可变类型赋值

可以看出,对于可变类型赋值,变量始终指向同一块地址。

2. 不可变类型赋值

对于不可变类型变量的赋值,刚开始是指向同一块地址,但修改任意变量,则修改的变量指向另外一块地址,不会影响另外一个变量。

那么问题来了,对于自定义的类型进行变量赋值,属于哪一种呢?

 3. 自定义类型变量赋值

 可以看出,对自定义变量中的属性进行修改也会传递。

但是,如果对整体变量重新赋值呢?

 

可以看出,如果对整体变量重新赋值,修改不会传递,修改的变量会指向新的地址。

对于自定义变量赋值的区别,不留意很容易踩坑,如下面函数,将列表转化为链表:

创建head结点的副本cur,对其进行赋值,赋值后再让它指向下一个节点,最终返回头结点,但结果出人意料。仔细分析发现,在for循环中重新对cur赋值,cur = Node(i),使得cur不再指向head节点,而是指向另一块内存地址,此时head和cur分路扬镳,再也没有关系了。

正确的做法是:

在for循环内,不对cur本身进行更改,只对其属性next进行更改,这样cur和head始终指向同一块地址,最终return head.next(因为第一个node没数据,真正的node从head.next开始) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值