python * operator,使用默认值创建列表

时间:2015-03-27 17:14:11

标签: python list python-3.x

以下如何运作?

>>> 3*[2]
>>> [2,2,2]
>>> [2]*3
>>> [2,2,2]

我知道*是位置扩展运算符。由于[2]是包含单个项目的列表,因此我不知道3*[2]如何扩展到任何有意义的内容,我期待SyntaxError,但是&#39}事实并非如此。

我很难搜索现有的答案,但我发现只有*args**kwargs用于传递可变参数列表,而这些参数列表并不能完全回答我的问题问题

1 个答案:

答案 0 :(得分:11)

*multiplication operator。所有Python序列都支持乘法。请参阅Sequence Types documentation

  

s * nn * s
     n s 连接的浅层副本

请注意,副本;任何嵌套的可变类型也不会以递归方式复制。这可能会导致令人惊讶的结果:

>>> nested = [[None]] * 5
>>> nested
[[None], [None], [None], [None], [None]]
>>> nested[0].append(42)
>>> nested
[[None, 42], [None, 42], [None, 42], [None, 42], [None, 42]]

只有一个嵌套[None]列表,引用了5次,而不是5个单独的列表对象。

*args**kw变量参数语法仅在函数定义或调用中具有意义(因此callable_object(<arguments>))。它根本不适用于此。有关该语法的更多详细信息,请参阅What does ** (double star) and * (star) do for parameters?

序列类型通过object.__mul__()object.__rmul__()方法重载*运算符(当表达式中为左或右操作数时),请参阅Emulating container types以获取有关内容的文档钩子序列类型通常实现。