【问题标题】:Python multiplication operator [duplicate]Python乘法运算符[重复]
【发布时间】:2012-03-30 20:30:14
【问题描述】:

可能重复:
Python list confusion

我是 python 的新手。请让我知道为什么 stairlist[1][0] = 2 语句在使用 stairlist = [[0,0]] * 8 初始化时会更改所有值。

>>> stairlist = [[0,0]] * 8
>>> stairlist
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
>>> stairlist[1][0] = 2
>>> stairlist
[[2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0]]

但是当我按照以下方式初始化 stairlist 变量时,它就可以正常工作了。

>>> stairlist = [[1,2],[1,2]]
>>> stairlist
[[1, 2], [1, 2]]
>>> stairlist[1][1] = 3
>>> stairlist
[[1, 2], [1, 3]]

【问题讨论】:

  • 看起来[[0,0]] * 8 语法使用别名而不是独立副本。不确定这是否在规范中,或者是实施问题。
  • @jpm:是的,它在规范中。它被称为序列重复。请参阅docs.python.org/library/… note (2),并注意副本被定义为浅副本。
  • @FelixKling 谢谢,我找到了解决方案。实际上,由于题名问题,我很难找到类似的问题。

标签: python


【解决方案1】:

array * number 将通过对原始数组中的每个对象进行 number 次的浅拷贝来创建一个新数组。

因为 [0,0] 本身是一个数组,因此是一个合适的对象,新数组只包含一堆对同一个 [0,0] 数组的引用。当你改变一个时,你就改变了所有的。

比较:

simplelist = [0] * 8
[0, 0, 0, 0, 0, 0, 0, 0]
simplelist[1] = 2
[0, 2, 0, 0, 0, 0, 0, 0]

【讨论】:

  • 你是什么意思“因此是一个合适的对象”? int 是一个合适的对象。此外,该类型称为list。由于一般情况下并非所有数组都如此,因此您需要具体。你的例子到底想展示什么?你做的和他不一样。如果他这样做 stairlist[1] = 2 他会得到完全相同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2021-07-18
相关资源
最近更新 更多