Python如何在一行中分配多个变量?

时间:2018-09-03 04:53:25

标签: 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

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

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

那么,该怎么做?

1 个答案:

答案 0 :(得分:6)

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