首页 > 解决方案 > 在 Python 中交换表达式中的表达式(交换三个及更多 var)

问题描述

我尝试在 Python 中分配三个表达式,但结果出乎意料。

让我们从简单的交换开始。你可能知道这个作业的结果:

A = [10, 11, 12]
p = 0
A[p + 1], A[p] = A[p], A[p + 1]    # <--
print(A)

结果是(如预期的那样):

[11, 10, 12]

现在我想更大胆一点,所以尝试了这个任务:

A = [10, 11, 12]
p = 0
p, A[p + 1], A[p] = p + 1, A[p], A[p + 1]   # <--
print(A)

我以为结果会是:

[10, 12, 11]

然而,结果是:

[10, 11, 10]

这是出乎意料的!

我阅读了有关作业的 Python 文档

尽管赋值的定义意味着左侧和右侧之间的重叠是“同时的”(例如 a,b = b,a 交换两个变量),但分配给变量集合中的重叠发生在左侧-to-right,有时会导致混乱。例如,以下程序打印 [0, 2]:

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

我的交换没有得到类似的结果。我不明白我的交换背后的逻辑。这是怎么回事?

标签: pythonpython-3.xvariable-assignment

解决方案


您可以将其视为使用临时变量从左到右连续赋值的简写:

p, A[p + 1], A[p] = p + 1, A[p], A[p + 1]

相当于

temp1  = p + 1  # 1
temp2  = A[p]   # 10  (A[0])
temp3  = A[p+1] # 11  (A[1])
p      = temp1   # p    = 1
A[p+1] = temp2   # A[2] = 10
A[p]   = temp3   # A[1] = 11

所以A = [10,11,10]

如果您放在p列表的末尾,您可能会更接近您的预期结果:

A[p + 1], A[p], p = A[p], A[p + 1], p + 1

A is now [11,10,12]
P is now 1

换句话说,后增量是可能的,但在这种情况下预增量将不起作用(在源数据中使用预增量索引)

您可以通过手动计算源数据中的偏移量来做到这一点,但这有点违反直觉:

p, A[p+1], A[p] = p+1, A[p+1], A[p+2]

推荐阅读