首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python抓到的问题:简单赋值结束时的逗号

Python抓到的问题:简单赋值结束时的逗号
EN

Stack Overflow用户
提问于 2012-07-23 22:09:16
回答 3查看 737关注 0票数 1

我只是在一天中的大部分时间里发现了一个错误,这个错误是在一份任务声明的末尾由一个错误逗号引起的。第三方回调库捕获异常加剧了查找我的错误的困难,但它让我想知道为什么Python (2.x)不引发语法错误而不是创建元组。考虑以下几点

代码语言:javascript
复制
>>> a = 1,
>>> a
(1,)

正如您所看到的,后面的逗号创建了一个单例元组。这并不违反Python语法(参见列表),但它肯定会导致一些意想不到的结果。

代码语言:javascript
复制
>>> a == 1,
(False,)

vs

代码语言:javascript
复制
>>> (1,) == a
True

虽然我现在了解了发生了什么,但我很困惑为什么Python允许这种语法,而不需要明确的括号来创建一个元组。在某些情况下这种行为是必要的,或者至少是有利的?--在过去的7年里,我几乎完全用进行编程--而且我从来不需要用这种方式创建一个单独的实例。在大多数方面,Python是一种可读性和显式的语言。这个特殊的“特征”似乎,嗯,非毕达通。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-23 23:16:28

下面是Python,解说的创建者Guido,这个语法是如何出现的:

在元组中添加类似数组的接口的结果之一是,我必须想出一些方法来解决长度为0或1的元组的边缘情况。我从ABC中学到的规则之一是,在打印或转换为字符串时,每个数据类型都应该由一个表达式来表示,该表达式是语言解析器的有效输入。因此,我需要对0和1长的元组进行符号化。同时,我不想失去一元组和带括号的表达式之间的区别,所以我选择了一种丑陋但实用的方法,在这种方法中,后面的逗号会将一个表达式变成一个元组,而"()“则表示一个零元组。除了这里,Python的元组语法通常不需要括号是不值得的--我觉得用“nothing”表示空元组太容易掩盖真正的排版。

还请参阅PythonInfo Wiki在TupleSyntax上的用法,特别是“.定义元组的是逗号,而不是括号。”

虽然这种语法并不漂亮(Guido说得很难看,但很实用),但我不认为这是个好问题。真正的问题在于您的第三方库“捕获异常”,从而隐藏了有关错误的重要信息。

票数 7
EN

Stack Overflow用户

发布于 2012-07-23 22:16:55

这里有一个例子,它很有用,可以交换两个值。当然,这里可以使用显式括号,但如果没有括号,情况会更好。

代码语言:javascript
复制
a, b = b, a
票数 2
EN

Stack Overflow用户

发布于 2012-07-23 22:52:34

对不起,我没有足够的代表发表评论,所以这是自己的答案。

这里有两个相关但不同的东西--元组解压和创建元组文字。

元组拆包在马克·兰森的回答中找到了。

然而,对于人们来说,元组似乎是一个绊脚石。它们不是用圆括号创建的,圆括号只用于消歧。逗号定义一个元组,所以a,是一个包含一个元素的元组,因为元组就是这样的,一个带有逗号的东西:)。(但要注意的是,对于空元组,而不是看起来丑陋的,,我们只能使用(),这可能是人们在这方面遇到困难的根源。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11621289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档