python 当引用复制子列表时,为什么使用赋值而不是append给予不同的结果

jpfvwuh4  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(136)
  • 正在创建子列表的多个引用副本。在任何项目中所做的更改都将更改到所有子列表。示例:
a=[[]]*3
a[1].append(7)
print(a)

输出:[[7],[7],[7]]
但如果我们做a[1]=7,那么输出将是[[],7,[]]
怎么会这样?

woobm2wo

woobm2wo1#

a = [[]] * 3

这将创建两个新列表。一个列表称为a,另一个列表在a中包含3次。
a[1]指向另一个列表(就像a[0]a[2]指向同一个列表一样)。
如果使用a[1].append,则修改另一个列表。因此,如果打印a,您将看到修改后的其他列表3次。

a[1] = 7

这不会修改其他列表。相反,它将列表a(以前是另一个列表)中索引1处的值替换为值7。

9jyewag0

9jyewag02#

当您这样做时:
a=[[]]*3
你正在创建一个包含相同[]对象3次的列表。因此,当你附加到[]时,它的所有副本也会被附加,得到a = [[7], [7], [7]]
如果先执行b = [],然后执行a = [b]*3,则会更容易看出。然后如果你追加到B,你希望它发生在所有3个插槽上。
但是,当使用a[1] = 7时,您会覆盖a的位置1中的对象。该对象现在不是列表,而是int。
我建议你研究python mutable objects,因为列表、字典和集合都是可变对象,知道它们的属性可能有助于你理解它们的行为。

fhity93d

fhity93d3#

因为a[1].append(7)改变了内部列表,所以a[1] = 7改变了外部列表。给引用赋值其他东西 * 并不会改变最初被引用的东西 *。
以下类似示例:

>>> a = []
>>> b = a
>>> a.append(42)
>>> print(a, b)
[42] [42]

对比:

>>> a = []
>>> b = a
>>> a = 42
>>> print(a, b)
42 []

相关问题