【问题标题】:List of Objects being Changed when Original Object is Changed更改原始对象时更改的对象列表
【发布时间】:2017-06-02 13:41:49
【问题描述】:

在 Python 中,如果我写:

a = [1]
b = 3 * [a]
a.append(2)
print a, b

那么,输出是:

[1, 2] [[1, 2], [1, 2], [1, 2]]

但是,当我写的时候:

a = [1]
b = 3 * a # notice the missing brackets here 
a.append(2)
print a, b

原来是这样的:

[1, 2] [1, 1, 1]

这是怎么回事?

【问题讨论】:

标签: python


【解决方案1】:

在第一个例子中,想想 Python 对这个语句做了什么:

b = 3 * [a]

变成:

b = [[a], [a], [a]]

因此,更改a 将反映在b 中,因为b 是由a 对象构成的。

但是,在第二个示例中,您这样做:

b = 3 * a

这会创建列表a 的副本,相当于:

b = [1, 1, 1]

因此,这次附加到a 时,没有任何变化。

【讨论】:

  • 我理解当我们说 b = [a] 时, b 和 a 都指向相同的引用。当我们提供b = a 时也是如此。那么为什么只有在 a 上应用带有 int 的“*”运算符时,它的行为才会有所不同,例如 b = 3 * a。你能解释一下吗? TIA
  • 当您执行b = 3 * a 时,它会创建a 的3 个副本(在本例中为1),并将它们放入一个列表中。至于为什么,我不能告诉你。我确信这与语言设计有关,但我对这个主题的了解不够,无法给出明确的答案。
【解决方案2】:

这是因为当您执行b = 3 * [a] 时,对变量a 的引用不会丢失。因此,在 a 中所做的任何更改都将在 b 中复制。

但是,当您运行 b = 3 * a 时,正在创建一个新的 list 实例,它不再引用 a 列表。

Python 中的所有数据结构都是对象,变量指向它们。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多