python - 在 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)
我的交换没有得到类似的结果。我不明白我的交换背后的逻辑。这是怎么回事?
解决方案
您可以将其视为使用临时变量从左到右连续赋值的简写:
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]
推荐阅读
- r - 在 Biomod2 中运行的 Maxent 模型的输出格式是什么(原始、累积、逻辑或阻塞日志),用户可以指定它吗?
- c++ - 将一个主题的数据放入回调函数中的动态数组中并进行一些计算
- android - 将新版本上传到 appstore/playstore 时,如何使用 Flutter 以编程方式更新 android/ios 应用程序
- google-apps-script - 通过 Apps 脚本访问 Google Classroom 中的监护人信息
- python - 如何将 Google Analytics 添加到 plotly dash 应用程序
- java - Mediaplayer在切换片段时没有暂停
- tfs - 如何在不让 TFS 签入的情况下在本地修改 web.config?
- python - 如何在跨平台(在 linux - windows 等)上使用 pycharm venv?
- shell - 是否将 stderr 重定向到 stdout 或将两者都重定向到同一个文件?
- ios - 在 Swift 中加载其他元素之后,在 TableViewCell 中异步加载一个元素