为什么在variables名称后添加尾随逗号使其成为一个元组?

我想知道为什么在variables名(在这种情况下是一个string)之后添加尾随逗号使其成为一个tuple 。 即

 >>> abc = 'mystring', >>> print(abc) ('mystring',) 

当我打印abc它返回tuple ('mystring',)

逗号,而不是括号,这是重要的。 Python教程说:

一个元组由多个由逗号分隔的值组成

圆括号用于在使用逗号的其他地方消除歧义,例如,使您可以嵌套或input元组作为参数列表的一部分。

请参阅元组和序列的Python Tutorial部分

因为这是用一个元素编写元组文本的唯一方法。 对于列表文字来说,必要的括号使得语法是唯一的,但是因为parantheses也可以表示分组,所以在圆括号中包含一个expression式并不会把它变成一个元组:你需要一个不同的语法元素,在这里是逗号。

更新

看上面的更好的答案 。

原始答复

在Python中,元组由括号表示

元组不用括号表示。 任何expression式都可以用括号括起来,这对元组来说并不特别。 只是碰巧总是有必要使用括号,因为否则它会是模棱两可的,这就是为什么元组上的__str____repr__方法会显示它们的原因。

我纠正了(我今天所做的一切,感叹)。

例如:

 abc = ('my', 'string') 

单元素元组呢? 括号表示法仍然成立。

 abc = ('mystring',) 

对于所有元组,括号可以省略,但逗号需要留在。

 abc = 'mystring', # ('mystring',) 

要么

 abc = 'my', 'string', # ('my', 'string',) 

所以实际上正在做的是创build一个元素元组而不是一个string。

文件清楚地说:

包含至less一个逗号的expression式列表产生一个元组。 元组的长度是列表中的expression式的数量。 expression式从左到右进行评估。

解包多元素元组:

 a, b = (12, 14) print type(a) 

输出:

INT

解包单元素元组:

 a, = (12, ) print type(a) 

输出:

INT

除此以外:

 a = (12,) print type(a) 

输出:

元组

当您在单个值后面看到逗号时,该值将被解释为数据types“元组”。

以下是我从一些可能适用于你们的经验中学到的一些东西:

如果你是一个音乐家,单词元组可能会令人困惑,因为元组和三元组是用来描述在一定types的时间签名内使用的音符分组,它们并不严格兼容。 例如,当拍号是6/8(三重感觉)时,如同拍号是4/4(直觉)一样,两个八分音符的组合起作用。 或者反过来在四分之三的时间内玩三联。 这导致新手程序员或许将元组解释为一对值。

这不是你在编程中看到的那种元组。 这些元组是一个不可变的(一次赋值的)序列数据types,它可以容纳任意数量的值,但是可以被认为是一起被传送,就好像它们全部被包围在圆括号之间,或者换句话说,括号中的一个元组。

一旦赋值,就不能添加或删除元组,因此通常用于打包和解压缩variables。 我经常使用它从一个函数返回多个值:

 def somefunction_foo(some_data_file): map1 = dict() map2 = dict() map3 = dict() with open(datafile, 'r') as file: # auto-close the file after this block for row in file: pass # don't actually pass, but # fill each map with specific data from the same file return map1, map2, map3 # I'm returning a tuple, but without parenthesis 

在问题的例子中,您将variables“abc”分配给长度为1的元组。

您可以使用以下相似的语法执行多个分配:

 x,y = 20,50 

还要注意的是,print语句对用逗号结束打印语句有特殊的理解; 这告诉打印省略尾随的换行符。

 print 'hello', print 'world' 

结果:

 hello world