从字符串对象初始化列表和元组

4

How the following two are differ:

>>> s = 'string'
>>> tuple(s)
('s', 't', 'r', 'i', 'n', 'g')
>>> tuple([s])
('string',)
>>> tuple((s))
('s', 't', 'r', 'i', 'n', 'g')
>>> tuple((s,))
('string',)
>>>    

字符串是可迭代对象,因此在元组内部分成多个元素?


1
如果对某些读者来说有点混淆,语义上 (s)s 是完全相同的。逗号是使你最后一个例子中的内部参数 (s,) 成为元组的原因,而不是封闭括号。或者你可以换句话说,括号是必要但不充分的。 :) - roippi
3个回答

5
元组不是由括号决定的,而是由逗号决定的:
>>> (1)
1
>>> (1,)
(1,)
>>> (1),
(1,)
>>> 1
1
>>> 1,
(1,)

中间的括号被移除,直到确定表达式为止:
>>> tuple((((('string')))))
('s', 't', 'r', 'i', 'n', 'g')
>>> tuple((((('string'))),))
('string',)
>>> tuple((((('string'),)),))
(('string',),)

您可以使用ast模块来解析Python中的表达式。
>>> import ast
>>> ast.literal_eval("((((('string')))))")
'string'
>>> ast.literal_eval("((((('string')))),)")
('string',)

并向您展示为什么tuple(('string'))tuple('string')是相同的。多余的括号不会创建一个元组,而只会被解析器丢弃。

3
如果在字符串或任何可迭代对象上调用 tuple,它将执行与在字符串上调用 list 相同的操作:遍历该可迭代对象的“最浅层”(第一维)部分。以下是示例:
>>> s = 'string'
>>> tuple(s)
('s', 't', 'r', 'i', 'n', 'g')
>>> tuple([s])
('string',)
>>>
>>> tuple((x for x in [s]))
('string',)

在第一个例子中,s 中的第一维是字符串 'string',所以元组会从 s 中获取每个值。在第二个例子中,第一维是包含变量 s 的列表 s。在这种情况下,变量本身就是第一维,因此整个字符串都被打包成元组。最后的生成器案例证明了这一点。

1
是的。 list 期望 其参数为 一个序列、支持迭代的容器或迭代器对象。
因此,它为字符串中的每个字符创建单独的字符串并返回列表。当您用 [](,) 包含它时,您正在创建字符串列表或字符串元组。因此,取出其中的每个元素并准备一个新列表。

感谢您的澄清。 - James Sapam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接