为了账号安全,请及时绑定邮箱和手机立即绑定

为什么foo.append(bar)影响列表列表中的所有元素?

为什么foo.append(bar)影响列表列表中的所有元素?

慕的地8271018 2020-02-01 17:17:19
我创建了一个列表列表,并希望将项目追加到各个列表中,但是当我尝试追加到列表之一(a[0].append(2))时,该项目就会添加到所有列表中。a = []b = [1]a.append(b)a.append(b)a[0].append(2)a[1].append(3)print(a)给出: [[1, 2, 3], [1, 2, 3]]我希望: [[1, 2], [1, 3]]更改构造列表的初始列表的方式,将b其替换为列表,然后将其放在花括号中.append(),可以得到所需的输出:a = []b = 1a.append([b])a.append([b])a[0].append(2)a[1].append(3)print(a)给出: [[1, 2], [1, 3]]但为什么?结果不一样是不直观的。我知道这与对同一列表的多个引用有关,但是我看不到发生了什么。
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

这是因为该列表包含对对象的引用。您的清单不包含[[1 2 3] [1 2 3]],而是[<reference to b> <reference to b>]。


更改对象时(通过向追加内容b),您更改的是对象本身,而不是包含对象的列表。


为了获得想要的效果,您的列表a必须包含的副本,b而不是的引用b。要复制列表,您可以使用range [:]。例如, :


>>> a=[]

>>> b=[1]

>>> a.append(b[:])

>>> a.append(b[:])

>>> a[0].append(2)

>>> a[1].append(3)

>>> print a

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


查看完整回答
反对 回复 2020-02-01
?
慕容3067478

TA贡献1773条经验 获得超3个赞

关键是这一部分:


a.append(b)

a.append(b)

您要追加两次相同的列表,因此a[0]和a[1]都是对同一列表的引用。


在第二个示例中,每次调用append like时都在创建新列表a.append([b]),因此它们是使用相同的float值初始化的单独对象。


查看完整回答
反对 回复 2020-02-01
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

为了制作列表的浅表副本,习惯用法是


a.append(b[:])

如果将其加倍,则将导致该列表具有两个新颖的副本,b而不会给您报告的别名错误。


查看完整回答
反对 回复 2020-02-01
  • 3 回答
  • 0 关注
  • 375 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信