为啥在变量名后添加尾随逗号使其成为元组?

Posted

技术标签:

【中文标题】为啥在变量名后添加尾随逗号使其成为元组?【英文标题】:Why does adding a trailing comma after a variable name make it a tuple?为什么在变量名后添加尾随逗号使其成为元组? 【发布时间】:2010-09-20 10:43:50 【问题描述】:

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

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

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

【问题讨论】:

另见:***.com/questions/7992559/… 这是一个很好的问题,教授 Python 的基本概念。 【参考方案1】:

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

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

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

见Python Tutorial section on Tuples and Sequences

【讨论】:

我对元组的理解发生了变化。【参考方案2】:

因为这是用一个元素编写元组文字的唯一方法。对于列表文字,必要的括号使语法唯一,但是因为括号也可以表示分组,所以将表达式括在括号中不会将其变成元组:您需要不同的语法元素,在这种情况下是逗号。

【讨论】:

【参考方案3】:

更新

much better answer 见上文。

原答案

在 python 中,元组由圆括号表示

元组没有用括号表示。任何表达式都可以用括号括起来,这对元组来说没什么特别的。碰巧几乎总是需要使用括号,否则它会产生歧义,这就是为什么元组上的__str____repr__ 方法会显示它们。

我的立场是正确的(我今天所做的一切。叹息)。

例如:

abc = ('my', 'string')

单元素元组呢?括号符号仍然有效。

abc = ('mystring',)

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

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

或者

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

所以实际上所做的是创建一个单元素元组,而不是一个字符串。

documentation 明确表示:

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

【讨论】:

无论元组有多少元素,括号都可以省略 @SilentGhost:我抓住了自己并纠正了它。在扔石头之前给我一点时间,好吗? :) 元组没有用括号表示。任何表达式都可以用括号括起来,这对元组来说没什么特别的。碰巧几乎总是需要使用括号,否则它会产生歧义,这就是为什么元组上的 __str____repr__ 方法会显示它们。【参考方案4】:

解包多元素元组:

a, b = (12, 14)

print type(a)

输出:

int

解包单元素元组:

a, = (12, )

print type(a)

输出:

int

否则:

a = (12,)

print type(a)

输出:

元组

【讨论】:

【参考方案5】:

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

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

如果您是音乐家,元组这个词可能会让人感到困惑,因为元组和三元组这两个词用于描述在特定类型的拍号中使用的音符分组,但它们并不严格兼容。例如,当拍号为 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

【讨论】:

【参考方案6】:

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

您可以使用类似的语法进行多项赋值:

x,y = 20,50

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

print 'hello',
print 'world'

结果:

hello world

【讨论】:

【参考方案7】:

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

在此,我用一个简单的例子来说明如何创建一个元组或一个列表。

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

【讨论】:

以上是关于为啥在变量名后添加尾随逗号使其成为元组?的主要内容,如果未能解决你的问题,请参考以下文章

在一行上用一个赋值命令给多个变量赋值,各变量之间用啥符号分隔

为啥 Prettier 不包括尾随逗号?

python list.append() 如何在列表名后引用变量

x, = ... - 这个尾随逗号是逗号运算符吗?

为啥字典可以解包为元组?

python实参和形参的区别