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

时间:2010-09-20 10:43:51

标签: python syntax tuples

我想知道为什么在变量名后添加一个尾随逗号(在本例中为一个字符串),这使得它成为tuple。即

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

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

7 个答案:

答案 0 :(得分:35)

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

  

元组由许多以逗号分隔的值组成

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

请参阅Python Tutorial section on Tuples and Sequences

答案 1 :(得分:7)

因为这是用一个元素编写元组文字的唯一方法。对于列表文字,必要的括号使语法唯一,但由于parantheses也可以表示分组,括在括号中的表达式不会将其转换为元组:您需要一个不同的语法元素,在本例中为逗号。

答案 2 :(得分:5)

<强>更新

请参阅上文了解much better answer

原始答案

在python中,元组用括号表示。

  

括号中没有表示元组。任何表达式都可以括在括号中,这对于元组来说并不是特别的。事实上,几乎总是需要使用括号,因为否则它将是模糊的,这就是元组上的__str____repr__方法将显示它们的原因。

我的立场得到了纠正(我今天一直都在做。叹气)。

例如:

abc = ('my', 'string')

单元素元组怎么样?括号表示法仍然有效。

abc = ('mystring',)

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

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

或者

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

实际上正在做的是创建单元素元组而不是字符串。

documentation清楚地说:

  

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

答案 3 :(得分:1)

解包多元素元组:

a, b = (12, 14)

print type(a)

输出:

  

INT

解包单元素元组:

a, = (12, )

print type(a)

输出:

  

INT

否则:

a = (12,)

print type(a)

输出:

  

元组

答案 4 :(得分:1)

当您在单个值后面看到逗号时,该值将被解释为数据类型&#39; tuple&#39;。

以下是我通过经验学到的一些内容,可能适用于你们中的一些人:

如果您是音乐家,单词元组可能会令人困惑,因为单词元组和三元组用于描述在特定类型的时间签名中使用的音符分组,这些音符不是严格兼容的。例如,当时间签名是6/8(三重感觉)时,两个八分音符的分组如同时间特征是4/4(直感)一样。反之亦然,三重奏在4/4时间播放。这导致新手程序员可能将元组解释为一对值。

这不是你在编程中看到的那种元组。这些元组是一个不可变的(一次分配的不可改变的)序列数据类型,它可以保存任意数量的值但可以被认为是一起转移,就好像它们全部被括在括号之间,或者换句话说,括号的元组。

一旦分配了元组,就无法添加或删除元组,因此它通常用于打包和解包变量。我经常使用它来从函数中返回多个值:

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

答案 5 :(得分:0)

在问题的示例中,您分配了变量&#39; abc&#39;到一个长度为1的元组。

您可以使用以下类似语法执行多项分配:

x,y = 20,50

另请注意,print语句对使用逗号结束print语句有特殊的理解;这告诉print省略了尾随换行符。

print 'hello',
print 'world'

结果:

hello world

答案 6 :(得分:0)

对于逗号的应用,我有些困惑,因为您还使用逗号来创建列表而不是元组,但具有不同的变量赋值。

这里是一个关于如何创建元组或列表的简单示例。

abc = 1,2,3 # prints a tuple: (1, 2, 3)
*abc, = 1,2,3 # prints a list: [1, 2, 3]