创建元组的单个元素元组

时间:2018-07-09 09:20:17

标签: python python-3.x tuples

我刚刚注意到,如果您要创建一个具有单个元素的元组(本身就是元组),则仅使用tuple语法就不能使用构造函数(,)来完成此操作。这是为什么?

示例:

>>> tuple(list('abc'))
('a', 'b', 'c')
>>> tuple(tuple(list('abc')))
('a', 'b', 'c')
>>> (tuple(list('abc')),)
(('a', 'b', 'c'),)

但是它保留了一个列表

>>> tuple([1],)
(1,)
>>> tuple([1])
(1,)

4 个答案:

答案 0 :(得分:5)

我看不到这个问题,这符合文档规定:

class tuple(object)
 |  tuple() -> empty tuple
 |  tuple(iterable) -> tuple initialized from iterable's items
 |  
 |  If the argument is a tuple, the return value is the same object.

因此,list('abc')始终求值为['a', 'b', 'c'],这是可迭代的。

因此,在第一个示例(tuple(['a', 'b', 'c']))中,结果是根据可迭代项初始化的元组。即(“ a”,“ b”,“ c”)。

第二个示例采用第一个示例(一个元组)的结果,并将其再次传递到tuple()函数中。正如文档所述(最后一行),传递元组时的返回值是与我们的结果匹配的对象。

第三次,the docs告诉我们我们需要知道的内容:

  

一个特殊的问题是包含0或1项的元组的构造:语法有一些额外的怪癖来容纳这些项。空元组由一对空括号组成;一个带有一个项目的元组是通过在值后面加上逗号来构造的(仅将一个值括在括号中是不够的。)


最后,最后两个示例(tuple([1])tuple([1],))都将生成一个单元素元组,因为您传递的是长度为1的可迭代对象。文档再次声明(在顶部):从iterable的项目初始化一个元组。

因此,总而言之,需要逗号的情况是要创建一个包含一个元素的元组。但是,如果传递长度为1的可迭代值,则没有必要,因为Python知道您不是在评估表达式。


出于完整性考虑,这种笨拙的语法不可避免,是因为诸如(1 + 2) * 3之类的语句的求值为(3, 3, 3)而不是预期的9。因此,相反,您必须通过添加逗号(1 + 2,) * 3来获得(3, 3, 3)的结果,这是很有意义的。

答案 1 :(得分:1)

在没有尾部逗号的情况下,Python会将您传递的值视为表达式。

>>> tuple(tuple(list('abc')))

会给你

tuple(('a','b','c'))

然后将其评估为元组

('a','b','c')

Here是您需要的更多信息

对于列表,tuple()使用可迭代对象来创建一个元组

答案 2 :(得分:1)

就是这样。

在现有对象上调用构造函数没有任何作用(例如,请参见list(list('1'))。调用tuple(list('1'))必须创建一个tuple,因此需要创建,。这不是第二个调用(tuple(tuple(list('abc'))))中必须存在内部tuple的地方,因此将其“投射”到元组不会执行任何操作

答案 3 :(得分:1)

  

...您不能仅使用(,)语法对构造函数元组进行操作

可以。只需在构建包含一个元素的元组时必须添加逗号,因为如果不这样做,则只会得到带括号的非元组元素:

t = ((1,),)

是一个包含一个包含整数1的单个元组的元组。

但是tuple仅将可迭代对象转换为元组。这样,它将在char元组中更改字符串,并在tuple中更改列表。而且,如果您通过一个元组,您将只获得原始元组的副本。