Jan*_*ila 2 python tuples python-3.x
我只是注意到,如果您想创建一个具有单个元素的元组(本身就是一个元组),则不能tuple仅使用(,)语法使用构造函数来执行此操作。这是为什么?
例:
>>> tuple(list('abc'))
('a', 'b', 'c')
>>> tuple(tuple(list('abc')))
('a', 'b', 'c')
>>> (tuple(list('abc')),)
(('a', 'b', 'c'),)
Run Code Online (Sandbox Code Playgroud)
但是,它保留了一个清单
>>> tuple([1],)
(1,)
>>> tuple([1])
(1,)
Run Code Online (Sandbox Code Playgroud)
我没有真正看到这个问题,它遵循文档:
Run Code Online (Sandbox Code Playgroud)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()再次传递给函数。正如文档所述(最后一行),传递元组时的返回值是与我们的结果匹配的同一对象。
第三,文档再次告诉我们我们需要知道的内容:
一个特殊的问题是包含0或1项的元组的构造:语法具有一些额外的怪癖来容纳这些项。空元组由一对空括号组成;一个带有一个项目的元组是通过在值后面加上逗号来构造的(仅将一个值括在括号中是不够的)。
最后,您的最后两个示例(tuple([1])和tuple([1],))都生成一个单元素元组,因为您传递的是长度为1的可迭代对象。文档再次声明(在顶部):从iterable的项目初始化一个元组。
因此,总而言之,当您要创建一个包含一个元素的元组时,需要使用逗号。但是,如果传递长度为1的可迭代值,则没有必要,因为Python知道您不评估表达式。
为了完整起见,这种尴尬的语法不可避免,是因为诸如这样的语句(1 + 2) * 3将求值(3, 3, 3)而不是期望值9。因此,相反,您必须通过添加逗号(1 + 2,) * 3来摆脱困境:要获得(3, 3, 3)完全有意义的结果。