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的更多信息,请点击此处:
好吧,"链式任务"是我追求的搜索术语,但经过一些挖掘之后,我认为这不是严格正确的.但搜索比"转让声明的特殊情况"更容易.
在Python中,赋值语句不是表达式,因此不返回值.相反,链式赋值是一系列具有单个表达式的多个目标的语句.分配从左到右执行,以便
i = arr[i] = f()
计算表达式f()
,然后将结果分配给最左边的目标,i
然后arr[i]
使用新值将相同的结果分配给下一个目标i
.
另一篇博文说:
在Python中,赋值语句不返回值.链接赋值(或更确切地说,看起来像链式赋值语句的代码)被识别并作为赋值语句的特殊情况得到支持.
这对我来说是最正确的,仔细阅读文档 - 特别是 (target_list "=")+
- 也说
赋值语句计算表达式列表...并从左到右将单个结果对象分配给每个目标列表.
所以它并非真正"从最左边到最左边进行评估" - 对RHS进行评估,然后从最左边的目标分配到右边 - 而不是我能想到任何真实世界(甚至是人为的)的例子.区别.
使用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.赋值语句,g
并h
在两个目标列表,x
作为表达式列表:
Run Code Online (Sandbox Code Playgroud)assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并从左到右将单个结果对象分配给每个目标列表.
归档时间: |
|
查看次数: |
11012 次 |
最近记录: |