为什么Python列表乘法创建具有多个元素的单个列表?

Rob*_*bin 1 python list

在python中,['a'] * 4给出['a', 'a', 'a', 'a']。为什么不[['a'], ['a'], ['a'], ['a']]呢?

che*_*ner 5

因为与整数乘法一样,重复加法也与lis乘法重复串联。

>>> ['a'] + ['a'] + ['a'] + ['a']
['a', 'a', 'a', 'a']
>>> ['a'] * 4
['a', 'a', 'a', 'a']
>>> 4 * ['a']
['a', 'a', 'a', 'a']
Run Code Online (Sandbox Code Playgroud)

这也遵守其他各种法律:

  • 分配: lst * n + lst * m == lst * (n + m)
  • 零属性: lst * 0 == 0 * lst == []
  • 乘法身份:lst * 1 == lst

上面的内容也与空白列表[]是加性标识一致,

['a'] + [] == [] + ['a'] == ['a']
Run Code Online (Sandbox Code Playgroud)

以来

['a'] + [] == ['a'] * 1 + ['a'] * 0  # zero property and multiplicative identity
           == ['a'] * (1 + 0)        # distribution
           == ['a'] * 1              # integer addition
           == ['a']                  # multiplicative identity
Run Code Online (Sandbox Code Playgroud)

按理说,list * int不应该在定义所有。为了快速生成n相同元素的列表,主要的用例是使用列表推导(稍后添加到语言中)更安全地完成。[x] * n创建对单个元素的引用列表,如果可变的话x,通常这不是您想要的x[x for _ in range(n)],而另一方面,通过创建独立定义对象的列表x,这你想要的东西时x是可变的。