为什么分配到一个空列表(例如[] =“”)会引发错误?

问题:

在python 3.4中,我打字

[] = "" 

它工作正常,没有异常提出。虽然[]当然不等于""

[] = ()

也工作正常

"" = []

尽管如此,

() = ""

虽然如预期的那样引起了例外。发生什么了?

回答:

你没有比较平等。你是分配
Python允许您分配到多个目标:

foo, bar = 1, 2

分别将这两个值分配给foobar。所有你需要的是右边的sequenceiterable,左边是一个列表或名称的元组。
当你做:

[] = ""

您将一个empty序列(空字符串仍然是序列)分配给一个空的名称列表。
它基本上是一样的:

[foo, bar, baz] = "abc"

您最终会遇到foo = "a"bar = "b"baz = "c",但字符数较少。
但是,您不能分配到一个字符串,所以分配左侧的""永远不会起作用,并且始终是语法错误。
请参阅Assignment statements documentation

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

将对象分配给目标列表可选地括在括号或方括号中,递归定义如下。

 Emphasis mine
那个Python不会为空列表引发语法错误实际上是一个错误!正式记录的语法不允许空目标列表,对于空的(),您会收到错误。见bug 23275;它被认为是一个无害的bug:

起点是认识到这已经存在了很长时间,是无害的。

另见Why is it valid to assign to an empty list but not to an empty tuple?

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why does assigning to an empty list (e.g. [] = “”) raise no error?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

38 + = 41