我刚刚注意到,如果您要创建一个具有单个元素的元组(本身就是元组),则仅使用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,)
答案 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中更改列表。而且,如果您通过一个元组,您将只获得原始元组的副本。