问题 python中带逗号的多个赋值


我试图找到一个解释 这个,Gotcha部分:

b = "1984"
a = b, c = "AB"
print(a, b, c)

收益:

('AB', 'A', 'B')

我理解多个等于会发生什么:

a = b = 1

但是将它与逗号一起使用,我无法理解为什么它以这种方式工作的行为,想法?


6980
2018-01-05 20:54


起源



答案:


答案是

a = b, c ="AB"

表现如下:

a = (b, c) = "AB"

这就是为什么:

a = "AB" and b = "A" and c = "B"

11
2018-01-05 20:57



太棒了,我花了一分钟才明白a =“AB”,以防其他人在想,是因为指向存储“AB”的内存,与第二次分配的结果无关 - Edward Zambrano
有趣的是, a="AB" 实际上是执行 之前  (b,c)="AB" (要看到这一点,你必须构建一个分配有副作用的情况)。这对我来说是违反直觉的,因为C / C ++会以相反的顺序执行。 - jez


答案:


答案是

a = b, c ="AB"

表现如下:

a = (b, c) = "AB"

这就是为什么:

a = "AB" and b = "A" and c = "B"

11
2018-01-05 20:57



太棒了,我花了一分钟才明白a =“AB”,以防其他人在想,是因为指向存储“AB”的内存,与第二次分配的结果无关 - Edward Zambrano
有趣的是, a="AB" 实际上是执行 之前  (b,c)="AB" (要看到这一点,你必须构建一个分配有副作用的情况)。这对我来说是违反直觉的,因为C / C ++会以相反的顺序执行。 - jez


a = b,c =“AB”

不会像你认为的那样解释。你确实有一个多重赋值,但它不是a = b和c =“AB”。它是c,b =“AB”和a =“AB”。在python中

x = y = z = 1

被解释为x,y和z被赋值为1.并且逗号用于将值列表解包为单个变量,因此b,c =“AB”将“AB”解包为“A”和“B”。所以在这一行的最后,

a = b,c =“AB”
a ==“AB”
b ==“A”
c ==“B”

0
2018-01-05 21:03





这归结为操作顺序,第2行实际上是两个不同的陈述。

a = b

先完成。然后

b, c = "AB"

这是解包“AB”的值并将“A”分配给b而“B”分配给c。


-2
2018-01-05 21:00



a=b 是 不 先完成。如果是的话,你就会有OP的预期行为 a 最终会成为 "1984"。 a="AB" 和 (b,c)="AB" 是实际发生的两个任务(在这种情况下执行它们的顺序不是问题) - jez
...但 a="AB"  是 先完成,之前 b=''A" 和 c="B"。这大概就是你想说的。而且我必须说,令我感到惊讶的是,作业按照这个顺序进行 - 但只有在分配的副作用时,顺序才有意义。 - jez
不知道我现在在想什么,我读了我写的东西......今天早上咖啡不够。 - BenJ
你的咖啡因不足的一个副作用是它让我想看看Python实际执行作业的顺序,我很高兴从中学到了新的东西。 - jez