Python 创建元组的单个元素元组

Python 创建元组的单个元素元组,python,python-3.x,tuples,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'),) 但是,它适用于一个列表 >>> tup

我刚刚注意到,如果您想创建一个具有单个元素的元组,作为元组本身,您不能使用构造函数
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,)

我真的看不出这个问题,这与文档有关:


因此,
list('abc')
的计算结果总是
['a','b','c']
,这是一个iterable

因此,在第一个示例(
tuple(['a','b','c'])
)中,结果是从iterable的项初始化一个tuple。即('a','b','c')

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

第三,再一次告诉我们需要知道的:

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


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

因此,总而言之,需要逗号的情况是要创建一个包含一个元素的元组。但是,如果传递长度为1的iterable,这是不必要的,因为Python知道您不是在计算表达式

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


为了完整起见,这种笨拙的语法是不可避免的,因为像:
(1+2)*3
这样的语句将计算为
(3,3,3)
,而不是预期的
9
。因此,您必须特意添加逗号:
(1+2,)*3
,以获得非常有意义的
(3,3,3)
结果。

如果没有结尾逗号,Python将把您传递的值作为表达式处理

>>> tuple(tuple(list('abc')))
我会给你

tuple(('a','b','c'))
然后将其计算为一个元组

('a','b','c')
如果你需要的话,还有更多的信息吗


至于列表,tuple()使用iterables创建一个tuple,它就是这样

对现有对象调用构造函数没有任何作用(例如,请参见
list(list('1'))
。调用
tuple(list('1'))
必须创建一个
tuple
,因此是
。第二次调用(
tuple(list('abc'))
)内部的
元组已经存在,因此将其“强制”到元组不会产生任何效果

…您不能仅使用(,)语法使用构造函数元组

可以。只需在构建包含单个元素的元组时添加逗号即可,因为如果不添加逗号,则只会得到一个括号内的非元组元素:

t = ((1,),)
是一个元组,其中包含一个包含整数1的元组


但是
tuple
只将一个iterable转换为一个tuple。因此,它在一个字符的tuple中更改字符串,并在tuple中更改列表。如果你传递一个tuple,你只会得到一个原始tuple的副本。

因为
tuple
函数接受一个iterable。如果它能够接受不同类型的项,那么应该有multI在函数中进行类型检查,这将使其效率低下。常识告诉我们,这根本不是一个好的/有效的/明智的决定/交易。哦,太好了,特别是最后一点让它非常清楚!非常感谢