python变量赋值机制踩坑记录
作者:惊瑟
这篇文章主要介绍了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开始)
到此这篇关于python变量赋值机制踩坑记录的文章就介绍到这了,更多相关python变量赋值踩坑记录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!