Python中的这种赋值是什么叫做?a = b =真

pfc*_*ise 28 python variable-assignment

我知道有关元组拆包的内容,但是这个赋值是什么,你在一行上有多个等号?一个啦a = b = True

当RHS可变时,它总是让我感到沮丧,但我在找到正确的关键词以便在文档中搜索时遇到了麻烦.

Fil*_*efp 51

它是一系列任务,用于描述它的术语是......

- 请问鼓棒吗?

链式作业.


我只是给了它一个非常谷歌的运行,并发现没有那么多关于这个主题的阅读,可能是因为大多数人发现它非常直接使用(只有真正的极客想要了解更多关于该主题) .


在前面的表达式中,评估的顺序可以被视为从最右边开始=然后向左边工作,这相当于写作:

b = True
a = b
Run Code Online (Sandbox Code Playgroud)

上面的顺序是大多数语言描述的赋值链,但是python以不同的方式表达.在python中,表达式被评估为下面的等价物,但它不会导致除了之前描述的任何其他结果.

temporary_expr_result = True

a = temporary_expr_result
b = temporary_expr_result
Run Code Online (Sandbox Code Playgroud)

有关stackoverflow的更多信息,请点击此处:

  • 它称这种"链式任务"是真正的罪魁祸首.如果`a = b = c`意味着在'a = b`之前执行`b = c`,那么它将被链接分配,但正如你所示,情况并非如此.分配*顺序*代替. (5认同)
  • 这澄清了在类似`x = dictionary ['x'] = value`的情况下,字典不使用set然后得到(就像它扩展到`dictionary ['x'] = value; x = dictionary [ 'x']`)但只设置字典值. (2认同)

pfc*_*ise 8

好吧,"链式任务"是我追求的搜索术语,但经过一些挖掘之后,我认为这不是严格正确的.但搜索比"转让声明的特殊情况"更容易.

维基百科文章 发送者链接说:

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

一篇博文说:

在Python中,赋值语句不返回值.链接赋值(或更确切地说,看起来像链式赋值语句的代码)被识别并作为赋值语句的特殊情况得到支持.

这对我来说是最正确的,仔细阅读文档 - 特别是 (target_list "=")+- 也说

赋值语句计算表达式列表...并从左到右将单个结果对象分配给每个目标列表.

所以它并非真正"从最左边到最左边进行评估" - 对RHS进行评估,然后从最左边的目标分配到右边 - 而不是我能想到任何真实世界(甚至是人为的)的例子.区别.

  • 显示顺序的人为例子很重要:`x = [0,1,2,3]; x [0:2] = x [1:3] = [4];`产生`[4,4]`,如果反转它们,则产生`[4,3]`。 (2认同)

Pau*_*McG 7

使用dis(反汇编)模块,此输出进一步支持@refp的答案:

>>> def a(x):
...   g = h = x
...
>>> import dis
>>> dis.dis(a)
  2           0 LOAD_FAST                0 (x)
              3 DUP_TOP
              4 STORE_FAST               1 (g)
              7 STORE_FAST               2 (h)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

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

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

对于那些使用的threading,有用的是要注意链接赋值形式在多个显式赋值语句中没有隐含的"原子性" - 在g和h的赋值之间可能发生线程切换,而另一个线程则在查看其中两个可以在两个变量中看到不同的值.

文档中,7.2.赋值语句,gh在两个目标列表,x作为表达式列表:

assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)
Run Code Online (Sandbox Code Playgroud)

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