【问题标题】:Iterating through a linked list with chain assignments使用链式分配遍历链表
【发布时间】:2020-08-06 03:48:20
【问题描述】:

假设我有以下名称和对象

original = n = <original_object>
n = n.next = <new_object>

运行上面的代码后,我希望看到original 指向&lt;original_object&gt;,但情况似乎并非如此。

但是,如果我这样做:

original = n = <original_object>
n.next = <new_object> # Attribute of the object class
n = n.next

然后我看到original 指向&lt;original_object&gt;(或者至少我认为我看到的是这样)。

具体例子

我将用 Python 3.8 中的链表来说明这一点:

class Node:
    def __init__(self, arg1):
        self.next = None

链式赋值:

head = n = Node(None)
n = n.next = Node(None)
print(head.next) # None (the "head" is gone?)

连续分配:

head = n = Node(None) 
n.next = Node(None) # *
n = n.next # *
print(head.next) # <__main__.Node object at 0x7fa4e0610ca0>

我的目的是在尾部添加节点时保留链表的“头部”。为什么链式分配和连续分配会得到不同的结果?

【问题讨论】:

  • 这能回答你的问题吗? How do chained assignments work?
  • 您将nn.next 分配给同一个Node(),并且在n = Node() 运行之后。这意味着head 不受影响,因为nn.next = Node() 运行之前首先被重新分配。查看最不被接受的答案。
  • 优秀。确实如此。谢谢@Carcigenicate。那就关门好了。对不起,我错过了:/
  • 这无疑是 Python 的一个奇怪之处,最终会咬到每个人,就像可变的默认参数一样。

标签: python python-3.x object linked-list


【解决方案1】:

@Carcigenicate 很快注意到,this answer 解释了正在发生的事情:

简而言之,按照我的示例中的那个论点,如果我这样做:

n = n.next = Node(None)

相当于:

temp = Node(None)
n = temp
n.next = temp

所以n被分配了一个new节点之前我在链表中​​“推进当前指针”(n),而我想做的是首先创建一个 new 节点,链接到它,然后 然后“将当前指针”(n)“推进”到新节点。

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2017-09-03
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多