Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多重赋值语义_Python_Variable Assignment - Fatal编程技术网

Python 多重赋值语义

Python 多重赋值语义,python,variable-assignment,Python,Variable Assignment,在Python中,可以执行以下操作: a, b = 1, 2 (a, b) = 1, 2 [a, b] = 1, 2 我使用dis检查生成的字节码,它们是相同的。 那么,为什么要允许这一切呢?我会需要其中一个而不是其他的吗?它们也是一样的,因为赋值是从右到左进行的,在右边,有一种类型,即两个元素的序列。当发出asignment调用时,序列将被解包,并查找与这些值匹配的对应元素。 是的,在这种情况下,任何一种方式都可以,其中序列被解包到各个元素 需要在作业左侧包含更多结构的一种情况是,要求P

在Python中,可以执行以下操作:

a, b   = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
我使用dis检查生成的字节码,它们是相同的。
那么,为什么要允许这一切呢?我会需要其中一个而不是其他的吗?

它们也是一样的,因为赋值是从右到左进行的,在右边,有一种类型,即两个元素的序列。当发出asignment调用时,序列将被解包,并查找与这些值匹配的对应元素。
是的,在这种情况下,任何一种方式都可以,其中序列被解包到各个元素

需要在作业左侧包含更多结构的一种情况是,要求Python解包稍微复杂一点的序列。例如:

# Works
>>> a, (b, c) = [1, [2, 3]]

# Does not work
>>> a, b, c = [1, [2, 3]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack

Python元组通常可以使用或不使用括号编写:

a = 1, 2, 3
a, (b, c) = 1, (2, 3)
相当于

a = (1, 2, 3)
在某些情况下,需要使用括号来解决歧义,例如,如果要将元组1、2传递给函数f,则必须编写f1、2。因为括号有时是需要的,所以它们总是被允许保持一致性,就像你总是可以写a+b而不是a+b一样

如果要解压缩嵌套序列,还需要括号:

a = 1, 2, 3
a, (b, c) = 1, (2, 3)

似乎没有理由也允许方括号,人们很少这样做。

开括号允许多行赋值。例如,当从csv.reader中读取一行时,如果使用单个赋值将列表加载到命名变量中的效率较低,则会使代码更具可读性

以括号开头可避免长行或转义行

(a, b,
c) = [1, 2, 3]

想象更多更长的变量名

解包单个元素iterable时,列表语法更漂亮:

a,=f()    # comma looks out of place
(a,)=f()  # still odd
[a]=f()   # looks like every other list

您是否暗示在某些情况下,它们的工作方式会有所不同?在这种情况下,当LHS是单个标识符时,则只进行一次STORE_FAST调用。否则,它都是相同的。+ 1用于检查生成的字节码,在这个上下文中,当方括号被允许时,你会认为它是一个错误吗?对我来说,这种行为似乎至少违反了:应该有一种——最好只有一种——显而易见的方式来做。特殊情况不足以打破规则。Thanks@eat当前位置我绝对不会称之为bug。显然是这样。我只是想知道这个设计决策的基本原理。好吧,这不是一个bug,但是当你说仅仅是想知道这个设计决策的基本原理让我也很好奇和困惑[…]=then?的哪怕是一个合理的用例?。感谢方括号语法使在对集合序列进行枚举时使用列表方法更加简单。无可否认,这是一个狭隘的用例,因为集合必须具有相同的长度才能以这种方式解包。更好的是:使用OrderedDict,我会有更多的含义。从python 3.7开始,字典是按插入顺序排列的,所以不需要有序字典。你提到的效率低下是什么?主要是用这些变量名填充名称空间。我知道这不是一个很大的负担,但我来自嵌入式背景;它可能比通过索引访问序列元素更有效,尤其是重复访问。