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在函数中进行类型检查,这将使其效率低下。常识告诉我们,这根本不是一个好的/有效的/明智的决定/交易。哦,太好了,特别是最后一点让它非常清楚!非常感谢