Python链表同内存节点引用修改next指针不同步问题咨询
Python链表引用问题核心解答
底层逻辑基础
Python中所有变量存储的都是内存地址引用,需要严格区分两类完全不同的操作:
- 修改引用的指向:仅改变当前变量/对象属性存储的地址值,不会触动被指向的原对象内存,也不会影响其他指向原对象的引用
- 修改指向对象的内部属性:直接修改内存中对象的存储内容,所有指向该对象的引用访问对应属性时都会同步看到变更
反转逻辑疑问解答
你疑惑第一轮反转时修改了节点3的next为None后仍能拿到4->5链表,核心原因是执行顺序的特性:
- 首先执行
next = head.next:此时head指向节点3,head.next存储的是节点4的内存地址,这个地址会被直接复制给变量next,next此时已经独立持有节点4的引用 - 再执行
head.next = prev:仅修改节点3的next属性的指向为None,完全不会改变next变量已经存储的节点4地址 - 最后执行
head = next:把next持有的节点4地址赋值给head,自然能正常访问4->5的完整链表
测试用例疑问解答
你疑惑修改head.next = None后middle仍能访问节点,是混淆了操作对象:
middle = find_middle(head)执行后,middle直接持有节点3的内存地址- 循环结束后
head指向的是节点2,head.next原本的指向是节点3 - 执行
head.next = None仅修改了节点2的next属性的指向,既没有修改节点3的任何内存数据,也没有改变middle存储的节点3地址,所以middle仍然可以正常访问节点3的value属性,完全符合引用规则,不存在逻辑相悖。
认知误区修正
你原本的认知“多个引用指向同一内存地址时,修改内存中的数据会同步到所有引用”是完全正确的,出现误解的原因是把「修改其他对象的属性指向」当成了「修改目标对象本身的内存数据」:
- 修改
middle.value = 'oops'属于修改目标对象(节点3)的内部属性,所以所有指向节点3的引用都会同步看到变更,符合预期 - 修改
head.next = None属于修改另一个对象(节点2)的属性指向,根本没有改动节点3的内存数据,自然不会影响middle对节点3的访问
内容的提问来源于stack exchange,提问作者Michael Torres
相关产品推荐
相关产品推荐

