【问题标题】:How Python assign multiple variables at one line works?Python如何在一行中分配多个变量?
【发布时间】:2018-09-03 13:28:07
【问题描述】:

Python 实际在一行中分配多个变量的步骤是什么?

我以前是做A[0],A[1] = A[1],A[0]来交换的,但是最近在分配链表的时候遇到了一个bug。

# insert self->node->...
def insert_next(self, node): 
  node.next, node.prev = self.next, self
  self.next, self.next.prev = node, node

self.next 变成 node 比我预期的要早,所以 assign 变成了

self.next, node.next = node, node     

但是,如果我这样做了

self.next.prev, self.next = node, node

有效!

我“假设”这些步骤是

1. cache values at the right side
2. assign to left side one by one, left to right

不是

1. cache values at the right side
2. cache the ref at the left side
2. assign to ref one by one, left to right

那么,步骤是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    Python 中有一种叫做“扩展赋值”的东西。

    长话短说,您可以使用赋值扩展可迭代对象。例如,这段代码计算并扩展右侧,实际上是一个元组,并将其分配给左侧:

    a, b = 3, 5
    

    或者

    tup = (3, 5)
    a, b = tup
    

    这意味着在 Python 中你可以用一行来交换两个变量:

    a, b = b, a
    

    它计算右侧,创建一个元组(b, a),然后扩展该元组并分配给左侧。

    有一条特殊规则,如果任何左侧变量“重叠”,则赋值从左到右进行

    i = 0
    l = [1, 3, 5, 7]
    i, l[i] = 2, 0  # l == [1, 3, 0, 7] instead of [0, 3, 5, 7]
    

    所以在你的代码中,

    node.next, node.prev = self.next, self
    

    此分配是并行的,因为 node.nextnode.prev 不会“重叠”。但是对于下一行:

    self.next, self.next.prev = node, node
    

    由于self.next.prev 依赖于self.next,它们“重叠”,因此首先分配self.next

    【讨论】:

    • 这是一个值得学习的好东西。您是否有文档链接,以便我更深入地挖掘?
    • @iBug 这是黄金。我应该能给你金币。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多