我偶然发现了' x = [m] * n'并在解释器中运行它我可以看到代码分配了一个用m初始化的n元素数组。但我无法在线找到此类代码的描述。这叫什么?
>>> x = [0]*7
>>> x
[0, 0, 0, 0, 0, 0, 0]
答案 0 :(得分:19)
*
只是一个乘法 - 因为列表的+
是直观的,意味着连接两个操作数,下一步是乘以标量 - [0] * N
意味着“连接这个自己列出N次“!
换句话说:*
是Python中为其原始序列类型定义的运算符,以及用于将序列与其自身连接多次的整数。它可以使用列表,元组甚至字符串。
这在Python中有点自然,因为该语言允许运算符重载 - 因此Python程序员确实希望运算符对对象做有意义的事情。
应该注意组成结果列表的对象不是原始列表中对象的副本 - 而是对同一对象的引用。因此,如果原始列表的内容只是数字或其他一些不可变对象,则没有任何意外 - 但如果它包含可变对象,例如内部列表,则在更改它们时可能会遇到严重的副作用 - 就像这样片段:
In [167]: a = [[0]] * 7
In [168]: a
Out[168]: [[0], [0], [0], [0], [0], [0], [0]]
In [169]: a[0].append(1)
In [170]: a
Out[170]: [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]
答案 1 :(得分:12)
从the Python docs' description开始,在整数*
和基本序列类型之间使用的乘法运算符n
执行序列n
次中项的序列重复。所以我认为你要找的术语是序列重复。请注意,这不是"序列复制",因为没有创建项目的副本 - 您对同一序列有n
个引用。