Python支持单行A/B交换(A,B=B,A),我们预计(B,A=A,B)会得到相同的结果.然而,我在处理列表条目时遇到了一个奇怪的行为.我在下面的代码中简化了我的发现:

nums = [0, 0, 0, 0]
n = 2
print(nums, "expected case")
nums[n - 1], n = n, nums[n - 1]
print(n, nums)

nums = [0, 0, 0, 0]
n = 2
print(nums, "unexpected case")
n, nums[n - 1] = nums[n - 1], n
print(n, nums)

以下是执行上述程序的输出:

[0, 0, 0, 0] expected case
0 [0, 2, 0, 0]
[0, 0, 0, 0] unexpected case
0 [0, 0, 0, 2]

问题:为什么上面的顺序改变会导致不同的结果?在第一种情况下,[-n]会在更新到nums之前出现.

推荐答案

只有当AB不相互依赖时,你的假设(A, B = B, AB, A = A, B是等价的陈述)才是正确的.问题是,在这两种情况下,右边的表达式都是你所期望的,而不是左边的表达式.在一种情况下,nnums[n-1]之前被分配(分配给0),因此您实际上可以访问列表的第0-1=-1个 case (这是最后一个 case ,如示例所示).在另一种情况下,计算n-1,并再次分配n,因此nums[n-1]对应于nums[1].请记住,表达式是从左到右"计算"的,即使在赋值时也是如此.

Python相关问答推荐

比较两个二元组列表,NP.isin

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

使用索引列表列表对列进行切片并获取行方向的向量长度

在Python中管理打开对话框

如何从.cgi网站刮一张表到rame?

所有列的滚动标准差,忽略NaN

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

合并帧,但不按合并键排序

如何更改groupby作用域以找到满足掩码条件的第一个值?

Pandas:计算中间时间条目的总时间增量

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

如何删除重复的文字翻拍?

判断Python操作:如何从字面上得到所有decorator ?

使用类型提示进行类型转换

GPT python SDK引入了大量开销/错误超时

极点替换值大于组内另一个极点数据帧的最大值

Matplotlib中的曲线箭头样式