在Python中,为什么这两个5 * ['th'] and [5 * ' th']
给出几乎相同的结果?
这里的问题是为什么5* ['th']
列出五次大而不是五个列表的列表。
>>>5 * ['th']
['th', 'th', 'th', 'th', 'th']
>>> [5 * 'th']
['ththththth']
对于5 * [' th'],预期结果是5个列表!
答案 0 :(得分:7)
为什么这些......给出几乎相同的结果?
他们没有。
5 * ['th']
这将生成一个包含单个元素'th'
的列表,然后将其乘以5.结果是一个包含该元素的5个副本的列表:
['th', 'th', 'th', 'th', 'th']
此列表的长度为5。
[5 * ' th']
这会将字符串' th'
连接五次,生成字符串' th th th th th'
,然后创建一个以该字符串作为唯一元素的列表。
[' th th th th th']
此列表的长度为1。
答案 1 :(得分:2)
因为1)原始表达式几乎相同2)列表和字符串都是迭代的并且在Python中表现得非常相似,所以乘以整数对于列表和字符串非常类似,在保留被乘数的原始类型的意义上,而不是说产生一个元组或原始类型的元素列表。有趣的是,基本的四个ariphmetic运算符中的三个返回与操作数之一相同类型的值,尽管在Python 3中重新定义了即使参数是整数也返回float。
答案 2 :(得分:1)
list
对象通过如何实现其list.__mul__
和list.__imul__
方法来定义它所认为的乘法。 Python实现者认为将内容复制N次到一个新列表对列表最有意义
有一个很好的理由 - 他们希望乘法像加法一样工作:
>>> ['th'] * 5
['th', 'th', 'th', 'th', 'th']
>>> ['th'] + ['th'] + ['th'] + ['th'] + ['th']
['th', 'th', 'th', 'th', 'th']
如果你将数字乘以5,你得到的数字是五倍,而不是五个数字。同样,如果将列表乘以5,则会得到一个五倍大的列表,而不是五个列表。
答案 3 :(得分:0)
当我浏览Magnus Lie Hetland的书Beginning Python中的示例程序时,这个问题突然浮现。当我向马格努斯问同样的问题时,我收到的部分答案如下。
*“以产生结果['th','th','th','th','th']的方式处理5 * ['th']的原因是使乘法与如果将数字乘以5,则得到的数字是数字的五倍,而不是五个数字。同样,如果将列表乘以5,则得到的列表是数字的五倍,而不是五个列表。“ * >