Python 中的 x = [m]*n 语法是啥?
Posted
技术标签:
【中文标题】Python 中的 x = [m]*n 语法是啥?【英文标题】:What is the x = [m]*n syntax in Python?Python 中的 x = [m]*n 语法是什么? 【发布时间】:2016-09-11 02:52:12 【问题描述】:我偶然发现了“x = [m]*n”并在解释器中运行它,我可以看到代码分配了一个用 m 初始化的 n 元素数组。但是我在网上找不到这种代码的描述。这叫什么?
>>> x = [0]*7
>>> x
[0, 0, 0, 0, 0, 0, 0]
【问题讨论】:
list repeat 也适用于字符串 【参考方案1】:*
只是一个乘法 - 因为列表的+
是一个直观的东西,意味着连接两个操作数,下一步是乘以一个标量 - [0] * N
表示“将这个列表与自身连接 N 次” !
换句话说:*
是 Python 中为其原始序列类型定义的运算符,并且是一个整数,用于将序列与自身连接该次数。它适用于列表、元组甚至字符串。
这在 Python 中有些自然,因为该语言允许运算符重载 - 因此 Python 程序员确实希望运算符对对象做有意义的事情。
应该注意组成结果列表的对象不是原始列表中对象的副本,而是对同一对象的引用。因此,如果原始列表的内容只是数字或其他一些不可变对象,那就不足为奇了 - 但如果它包含可变对象,例如内部列表,则在更改它们时可能会受到严重的副作用 - 就像在这个sn-p:
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]]
【讨论】:
第二部分是这个语法真正重要的部分。【参考方案2】:从the Python docs' description 开始,在整数n
和原始序列类型之间使用的乘法运算符*
对序列n
中的项目执行序列重复次数。所以我想你正在寻找的术语是序列重复。请注意,这不是“序列复制”,因为没有创建项目的副本 - 您有 n
对相同序列的引用。
【讨论】:
希望我能接受两个答案。谢谢你们俩。史蒂夫·S 只是我在写 y 答案时花时间学习的一个注释:*
实际上没有为任何序列定义 - 它是为内置序列类型定义的(list tuple,ste , bytes, bytearray),但不作为 collections.abc.Sequence
的混合功能存在,“事实上”定义了“序列协议”。 (在 Python 2.x 中,只需 collections.Sequence
)
@jsbueno:这是因为collections.abc.Sequence
不能假设您的构造函数会像标准序列那样采用可迭代对象。集合也会出现同样的问题,但是省略所有集合运算符会留下一个不是集合的集合,所以他们硬着头皮在一个可以覆盖的私有方法中做出假设。以上是关于Python 中的 x = [m]*n 语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
python - 这个def中的n + = 2是啥? [复制]
在 python 中, ++x 是正确的语法。 “++x”是啥意思? [复制]