Python中的这种赋值称为什么?a=b=True

Python中的这种赋值称为什么?a=b=True,python,variable-assignment,Python,Variable Assignment,我知道,但是当你在一条线上有多个等号的时候,这个作业叫什么?a laa=b=True 它总是让我有点困惑,尤其是当RHS是可变的时,但我真的很难在文档中找到合适的关键字进行搜索。这是一个分配链,用于描述它的术语是 -请给我一个鼓乐好吗 链式分配。 我只是在谷歌上浏览了一下,发现关于这个主题没有太多可读的内容,可能是因为大多数人觉得它使用起来非常简单(只有真正的极客才会想知道更多关于这个主题的内容) 在前面的表达式中,计算顺序可以看作是从最右边开始,然后向左,这相当于写: b = True a

我知道,但是当你在一条线上有多个等号的时候,这个作业叫什么?a la
a=b=True


它总是让我有点困惑,尤其是当RHS是可变的时,但我真的很难在文档中找到合适的关键字进行搜索。

这是一个分配链,用于描述它的术语是

-请给我一个鼓乐好吗

链式分配。
我只是在谷歌上浏览了一下,发现关于这个主题没有太多可读的内容,可能是因为大多数人觉得它使用起来非常简单(只有真正的极客才会想知道更多关于这个主题的内容)


在前面的表达式中,计算顺序可以看作是从最右边开始,然后向左,这相当于写:

b = True
a = b

上面的顺序是大多数语言描述赋值链的顺序,但python的描述有所不同。在python中,表达式的计算结果如下所示,尽管它不会产生任何与前面描述的结果不同的结果

temporary_expr_result = True

a = temporary_expr_result
b = temporary_expr_result

有关stackoverflow的更多信息:

好的,“链式分配”是我想要的搜索词,但经过进一步挖掘,我认为这并不完全正确。但它比“赋值语句的特例”更容易搜索

链接到说:

在Python中,赋值语句不是表达式,因此不是 返回一个值。相反,链式分配是一系列 一个表达式具有多个目标的语句。这个 分配从左到右执行,以便
i=arr[i]=f()
计算表达式
f()
,然后将结果赋给最左边的 目标,
i
,然后将相同的结果分配给下一个目标,
arr[i]
,使用新值
i

另一个说:

在Python中,赋值语句不返回值。锁链 赋值(或者更准确地说,看起来像链式赋值的代码) 语句)作为 分配声明

这对我来说似乎是最正确的,尤其是仔细阅读
(target_list“=”+
),其中

赋值语句计算表达式列表。。。分配 从左到右,将单个结果对象添加到每个目标列表 对


因此,它并不是真正的“从最右边到左边评估”——RHS是从最左边的目标到右边评估然后分配的——我想不出任何现实世界(甚至是人为的)例子会有什么不同。

@refp的答案通过使用
dis
(反汇编)模块的输出得到进一步支持:

检索并复制RHS,然后从左到右将其存储到目标变量中(请自己尝试使用
e=f=g=h=x

如果RHS是一个函数调用,则其他一些海报会被混淆,如
a=b=fn()
-RHS只计算一次,然后将结果分配给每个后续变量。如果返回的值是可变的,如列表或dict,这可能会导致不必要的共享

对于那些使用
线程
的人,需要注意的是,链式赋值形式在多个显式赋值语句上并不隐含“原子性”——对g和h的赋值之间可能会发生线程切换,另一个查看这两个变量的线程可能会在两个变量中看到不同的值

从中,
g
h
是两个目标列表,
x
是表达式列表:

赋值语句计算表达式列表(请记住,这可以是单个表达式或逗号分隔列表,后者生成元组),并将单个结果对象从左到右分配给每个目标列表


由于我的无知,我今天被python的链式作业给咬了。编码

if l1.val <= l2.val:
    tail = tail.next = l1 # this line 
    l1 = l1.next
而我得到了下面的结果,它在列表中产生了一个自我循环,让我处于一个无休止的循环中,哎呀

tail = l1
tail.next = l1 # now l1.next is changed to l1 itself
因为对于a=b=c, 单向(例如python)等效于

tmp = evaluate(c)
evaluate(a) = tmp
evaluate(b) = tmp
和具有相等的右操作数进行两次赋值

另一个(例如C++)相当于

evaluate(b) = evaluate(c)
evaluate(a) = evaluate(b)
因为在这种情况下,
a=b=c
基本上是

b = c
a = b
两个右操作数可能不同


<为什么类似代码在C++中工作得很好?< /p>我会称它们为“。”这回答了你的问题吗?我的描述是从开发人员的角度出发的,正如您自己所说的:在现实世界中,没有一种情况下,措辞会导致不同的结果。或者,现在我真的能想到一个。。等等,我会用一个小片段来更新我的答案来解释我的意思。不管怎样,这是没有意义的(如果没有大规模的python攻击,这是不可能做到的,这超出了问题的范围),虽然我会用你帖子中的一些信息更新我的答案。请记住,这不像一个普通论坛,你可以用新答案回复以前的帖子,如果你对一篇帖子中的内容有评论,请使用“评论”功能,如果一篇文章后来被删除/修改,在文章中引用另一个答案可能会引起麻烦。@refp我知道如何使用堆栈溢出。我没有回答你的答案,这促使我做更多的挖掘,找到我自己的答案。上次我检查过这是做事情的正确方法——通过一个精心设计的例子来说明顺序可能很重要:
x=[0,1,2,3];x[0:2]=x[1:3]=4]
的结果是
[4,4]
,如果您将其反转,则结果是
[4,3]
。是否有此从左到右评估的文档?@AshwiniChaudhary是的,我添加了文档中的相关摘录。它将此称为“链式分配”
tmp = evaluate(c)
evaluate(a) = tmp
evaluate(b) = tmp
evaluate(b) = evaluate(c)
evaluate(a) = evaluate(b)
b = c
a = b