a=[[]]*3 a[1].append(7) print(a)
输出:[[7],[7],[7]]但如果我们做a[1]=7,那么输出将是[[],7,[]]怎么会这样?
woobm2wo1#
a = [[]] * 3
这将创建两个新列表。一个列表称为a,另一个列表在a中包含3次。a[1]指向另一个列表(就像a[0]和a[2]指向同一个列表一样)。如果使用a[1].append,则修改另一个列表。因此,如果打印a,您将看到修改后的其他列表3次。
a
a[1]
a[0]
a[2]
a[1].append
a[1] = 7
这不会修改其他列表。相反,它将列表a(以前是另一个列表)中索引1处的值替换为值7。
9jyewag02#
当您这样做时:a=[[]]*3你正在创建一个包含相同[]对象3次的列表。因此,当你附加到[]时,它的所有副本也会被附加,得到a = [[7], [7], [7]]。如果先执行b = [],然后执行a = [b]*3,则会更容易看出。然后如果你追加到B,你希望它发生在所有3个插槽上。但是,当使用a[1] = 7时,您会覆盖a的位置1中的对象。该对象现在不是列表,而是int。我建议你研究python mutable objects,因为列表、字典和集合都是可变对象,知道它们的属性可能有助于你理解它们的行为。
a=[[]]*3
[]
a = [[7], [7], [7]]
b = []
a = [b]*3
fhity93d3#
因为a[1].append(7)改变了内部列表,所以a[1] = 7改变了外部列表。给引用赋值其他东西 * 并不会改变最初被引用的东西 *。以下类似示例:
a[1].append(7)
>>> a = [] >>> b = a >>> a.append(42) >>> print(a, b) [42] [42]
对比:
>>> a = [] >>> b = a >>> a = 42 >>> print(a, b) 42 []
3条答案
按热度按时间woobm2wo1#
这将创建两个新列表。一个列表称为
a
,另一个列表在a
中包含3次。a[1]
指向另一个列表(就像a[0]
和a[2]
指向同一个列表一样)。如果使用
a[1].append
,则修改另一个列表。因此,如果打印a
,您将看到修改后的其他列表3次。这不会修改其他列表。相反,它将列表
a
(以前是另一个列表)中索引1处的值替换为值7。9jyewag02#
当您这样做时:
a=[[]]*3
你正在创建一个包含相同
[]
对象3次的列表。因此,当你附加到[]
时,它的所有副本也会被附加,得到a = [[7], [7], [7]]
。如果先执行
b = []
,然后执行a = [b]*3
,则会更容易看出。然后如果你追加到B,你希望它发生在所有3个插槽上。但是,当使用
a[1] = 7
时,您会覆盖a的位置1中的对象。该对象现在不是列表,而是int。我建议你研究python mutable objects,因为列表、字典和集合都是可变对象,知道它们的属性可能有助于你理解它们的行为。
fhity93d3#
因为
a[1].append(7)
改变了内部列表,所以a[1] = 7
改变了外部列表。给引用赋值其他东西 * 并不会改变最初被引用的东西 *。以下类似示例:
对比: