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