【问题标题】:Does adding a list unassigned to a variable to another variable pointing to a different list create a new list object?将未分配给变量的列表添加到指向不同列表的另一个变量是否会创建新的列表对象?
【发布时间】:2026-02-11 10:55:02
【问题描述】:

这就是我的意思:

x = [1, 2, 3]
y = x
y = y + [4]

据我了解,变量y指向变量x,该变量存储了列表对象[1,2,3]。在第二行代码中,xy 都存储了相同的 id。在最后一行代码中,我们更改了变量y 存储的内容。将列表[4] 添加到 y 会创建一个包含 4 的 int 对象的新列表对象吗?我很确定 xy 仍然指向同一个 id,因为列表是可变的,我只需要在 [4] 上进行确认。是否创建了新的列表和 int 对象?

【问题讨论】:

  • 列表不是不可变的。 tuples 是。但这与您在此处列出的特定代码的行为无关。
  • 你用过赋值运算符吗? y is x 说什么?
  • 哎呀,是的!我的错!
  • 是的,这是否意味着创建了一个新的 int 对象来存储数字 4?它会说 True,所以 x 和 y 都将指向列表 [1, 2, 3, 4]。

标签: python list memory mutable


【解决方案1】:

表达式y + [4] 创建一个新列表,该列表是将[4] 添加到y 包含的任何内容中的结果。将该表达式的结果分配给 y 会更改 y 以指向已创建的新列表。

这与下面的代码并没有什么不同:

y = 1
y = y + 1

在这段代码之后,y 将变为21 的含义没有改变。

【讨论】:

  • 在 Idle 上检查这个,我发现第一行中 y 的 id 与添加 [4] 后的 y 的 id 相同。那么从某种意义上说,我们不是只是将 4 附加到列表 y 上,而不是创建一个新列表吗?
【解决方案2】:

没关系,我明白了!我错了,在第三行为y 创建了一个新对象!它是列表 [1, 2, 3, 4]。变量 x 仍然引用 list [1, 2, 3]。添加 [4] 类似于 python 中的 .extend() 函数,其中将为 4 创建一个新的 int 对象,而不是包含该 int 的新列表对象!

【讨论】:

    最近更新 更多