python变量赋值踩坑记录
惊瑟 人气:0先说结论:
变量赋值属于浅拷贝(关于深拷贝和浅拷贝的区别可以自己了解下)。故如果是可变类型变量(如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开始)
加载全部内容