python 中列表的可变性

Mutability of lists in python

示例一:改变已经附加到b的值改变了原始列表l中的值

>>> l = [1 , 2, 3]
>>> b = []
>>> b.append(l)
>>> b[0].append(4)
>>> b
[[1, 2, 3, 4]]
>>> l
[1, 2, 3, 4]

例2:在ans后面追加l1,然后修改l1的值。但是,ans中的值保持不变。

>>> l1 = [1, 2, 3]
>>> ans = []
>>> ans.append(l1)
>>> ans
[[1, 2, 3]]
>>> l1 = [2, 3, 4]
>>> ans
[[1, 2, 3]]

我似乎遗漏了一些关于列表可变性的基本要点。有人可以指出吗?

你没有变异 l1。您正在将一个新对象分配给相同的名称,这使得该名称指向一个新对象。您正在移动标签,而不是修改对象。 l1 过去指向的列表的唯一剩余引用现在是 ans[0].

替换

>>> l1 = [2, 3, 4]

>>> l1[:] = [2, 3, 4]

这不会将新列表分配给 l1。

在你的第一个例子中,l 是一个指针,b

l 然后附加到 b,所以 b[0] 现在指的是指针。

接下来,您将 4 附加到 b[0],这与 l 相同,因此 4 将同时添加到 b[0] l.


在您的第二个示例中,ans 包含 l1 的指针,就像 b 包含 l

的指针一样

然后,您通过将 l1 分配给另一个数组来更改它本身,因此 l1 发生了更改,但 ans[0] 没有。


最大的收获是 append 只是改变了列表,而指针保持不变。但是,当您将变量设置为不同的列表时,指针会发生变化。