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

Id 应该是相似的,但没有人可以解释我为什么

Id 应该是相似的,但没有人可以解释我为什么

茅侃侃 2021-10-10 16:19:11
前后对象的 id 应该相同,但不会发生。有人能解释一下为什么要制造一个新对象吗?L = [1, 2, 3]    print(id(L))L = L + [4]print(id(L))正在打印的两个 id 是不同的,不应该是相同的,它是一个可变对象。但是当我使用 list 的 append 方法添加 4 时,id 是相同的
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

虽然列表是可变的,但这并不意味着所有涉及它们的操作都会改变列表。在您的示例中,您正在L + [4]连接两个列表。在list.__add__那个被调用执行该方法创建一个新的列表,而不是修改L。您将旧名称绑定L到新列表,因此您从id(L)更改中获得的值。


如果您想L在向末尾添加值的同时进行变异,有几种方法可以做到。L.append(4)如果您只需要添加一个项目,这是显而易见的选择。L.extend([4])或者L += [4]如果第二个列表中的项目多于一个,则几乎同义的可以工作。


请注意,有时您想要创建一个新列表!如果想要保留对旧列表的未修改引用,可能需要在添加新值的同时创建一个包含其大部分内容的新列表。虽然您可以复制列表,然后使用我上面提到的一种就地方法,但您也可以同时使用+复制值并将值添加到列表中(只需将结果绑定到新名称):


L = [1, 2, 3]

M = L + [4]  # this is more convenient than M = list(L); M.append(4)

print(L) # unchanged, still [1, 2, 3]

print(M) # new list [1, 2, 3, 4]


查看完整回答
反对 回复 2021-10-10
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

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