以下如何运作?
>>> 3*[2]
>>> [2,2,2]
>>> [2]*3
>>> [2,2,2]
我知道*
是位置扩展运算符。由于[2]
是包含单个项目的列表,因此我不知道3*[2]
如何扩展到任何有意义的内容,我期待SyntaxError
,但是&#39}事实并非如此。
我很难搜索现有的答案,但我发现只有*args
和**kwargs
用于传递可变参数列表,而这些参数列表并不能完全回答我的问题问题
答案 0 :(得分:11)
*
是multiplication operator。所有Python序列都支持乘法。请参阅Sequence Types documentation:
s * n
,n * 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以获取有关内容的文档钩子序列类型通常实现。