为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中交换表达式中的表达式(交换三个或更多 var)

在 Python 中交换表达式中的表达式(交换三个或更多 var)

手掌心 2021-12-26 14:41:29
我尝试在 Python 中分配三个表达式,但结果出乎意料。让我们从简单的交换开始。你可能知道这个任务的结果:A = [10, 11, 12]p = 0A[p + 1], A[p] = A[p], A[p + 1]    # <--print(A)结果是(如预期的那样):[11, 10, 12]现在我想更大胆一点,所以尝试了这个任务:A = [10, 11, 12]p = 0p, 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 交换两个变量),但分配给变量的集合内的重叠发生在左侧- 向右,有时会导致混乱。例如,以下程序打印 [0, 2]:x = [0, 1]i = 0i, x[i] = 1, 2         # i is updated, then x[i] is updatedprint(x)我的交换没有得到类似的结果。我不明白我的交换背后的逻辑。这是怎么回事?
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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


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]


查看完整回答
反对 回复 2021-12-26
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信