Python如何在一条线上分配多个变量?

Den*_*nly 5 python

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

我用来做A [0],A [1] = A [1],A [0]交换,但最近我在分配链表时遇到了一个错误.

# insert self->node->...
def insert_next(self, node): 
  node.next, node.prev = self.next, self
  self.next, self.next.prev = node, node
Run Code Online (Sandbox Code Playgroud)

self.next变得node早于我的预期,所以分配成为

self.next, node.next = node, node     
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做

self.next.prev, self.next = node, node
Run Code Online (Sandbox Code Playgroud)

有用!

我"假设"步骤是

1. cache values at the right side
2. assign to left side one by one, left to right
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

那么,步骤是什么?

iBu*_*Bug 10

Python中有一种叫做"扩展分配"的东西.

长话短说,您可以使用赋值扩展可迭代.例如,此代码评估并扩展右侧,实际上是一个元组,并将其分配给左侧:

a, b = 3, 5
Run Code Online (Sandbox Code Playgroud)

要么

tup = (3, 5)
a, b = tup
Run Code Online (Sandbox Code Playgroud)

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

a, b = b, a
Run Code Online (Sandbox Code Playgroud)

它评估右侧,创建一个元组(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]
Run Code Online (Sandbox Code Playgroud)

所以在你的代码中,

node.next, node.prev = self.next, self
Run Code Online (Sandbox Code Playgroud)

这种分配是并行的,因为node.nextnode.prev没有"重叠".但对于下一行:

self.next, self.next.prev = node, node
Run Code Online (Sandbox Code Playgroud)

根据具体self.next.prev情况self.next,它们"重叠",因此self.next首先分配.