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

12

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个回答

27

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被赋值在前面,因为self.next.prev依赖于self.next,它们“重叠”。


这是一个很好学的东西。你有文档链接吗,这样我可以更深入地了解吗? - chinuy
@iBug 这真是太棒了。我应该能够给你金币。 - zeal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接