在python中,['a'] * 4给出['a', 'a', 'a', 'a']。为什么不[['a'], ['a'], ['a'], ['a']]呢?
因为与整数乘法一样,重复加法也与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是可变的。