为何修改cur后ListNode的a.next未改变?技术问题咨询
问题:修改cur后为何a.next的值未发生变化?
前置定义(ListNode类)
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next
测试代码
a = ListNode(0) b = ListNode(0) a.next = b print(a.next) cur = b cur = ListNode(3) print(a.next, a.next.val)
输出结果
<__main__.ListNode object at 0x7fd131f7e910> <__main__.ListNode object at 0x7fd131f7e910> 0
请问为何修改cur后,a.next的值没有发生变化?
解答
在Python中,变量本质是指向对象的引用,而非对象本身,这是核心原因:
- 执行
cur = b时,cur只是获得了指向b所对应ListNode对象的引用——这个对象和a.next指向的是同一个(内存地址为0x7fd131f7e910的实例)。 - 但执行
cur = ListNode(3)时,你并没有修改原来的对象,而是让cur这个引用重新指向了一个全新创建的ListNode实例。此时cur和b、a.next的引用关系完全断开,新对象和旧对象毫无关联,自然不会影响a.next的值。
如果想要修改a.next指向的对象内容,应该操作引用指向的对象属性,比如:
cur = b cur.val = 3 # 修改原有对象的val属性
这样a.next.val就会变成3,因为cur指向的还是原来那个对象,只是修改了它的内部属性。
简单类比:cur就像一把钥匙,一开始开的是b对应的门;后来你把钥匙换成了开新门的钥匙,原来的门不会有任何变化;只有用原来的钥匙去改动门里的东西,原来的门才会出现变化。
内容的提问来源于stack exchange,提问作者Dian He
相关产品推荐
相关产品推荐

