【问题标题】:python * operator, creating list with default valuepython * 运算符,使用默认值创建列表
【发布时间】:2015-03-27 17:14:10
【问题描述】:

以下如何工作?

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

我知道* 是位置扩展运算符。由于[2] 是一个包含单个项目的列表,我看不到3*[2] 如何扩展为任何有意义的东西,我希望SyntaxError,但事实并非如此。

我很难搜索现有答案,我找到的只是对 *args**kwargs 的引用,用于传递可变参数列表,这并不能完全回答我的问题。

【问题讨论】:

  • * 也是乘法运算符,它对序列有特殊的行为。见the documentation
  • @BrenBarn 在这种情况下如何区分乘法和扩展?
  • 不是扩展运算符,只是乘法运算符
  • @ash:*args 参数扩展只能在函数调用的括号内使用。这里没有函数调用。它“知道”在这里使用乘法,就像它知道在您编写 2*3 并得到 6 时使用乘法一样。
  • @BrenBarn 啊,完美,这正是我想知道的。谢谢,伙计!

标签: python list python-3.x


【解决方案1】:

*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 以获取有关序列类型通常实现什么挂钩的文档。

【讨论】:

  • 你太快了:/ 每当我遇到问题时,你已经修复了代码语法并用完美的示例和文档链接回答了这个问题。哦,好吧,这是一种恭维,所以请保持如此乐于助人!
  • 我认为值得一提的是__mul__ 方法,因为它似乎是一个混淆点。由于包含星号的表达式中使用的对象,Python 可以区分乘法和列表扩展。如果你的对象是一个列表,Python 在列表类中使用了__mul__ 函数。字符串和整数也一样。这完全取决于使用的对象。
  • @MalikBrahimi:已添加,包括表达式右侧列表的 __rmul__ 替代项。
  • @Malik 好吧,在某些情况下,__rmul__ 最终会被调用......现在对于 OP 来说可能有点 TMI :p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2021-05-30
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多