为什么将列表元素分配给变量在这里以不同的方式工作?

Why does assiging a list element to a variable work in a different manner here?

我有这段代码:

lst = [[1,1], [2,1],[3,1]]
n = len(lst)
head = lst[n - 1]

head[0] += 1

lst.append(head)
del lst[0]

print(lst)

我希望打印此代码:[[2,1], [3,1], [4,1]] 但它正在打印:[[2, 1], [4, 1], [4, 1]]. 我不明白为什么。请帮助我。

当你写 head = lst[n - 1] 时,通过引用将 head 设置为 lst 的最后一个元素。这意味着具有值 [3,1] 的对由两个变量共享。如果你不想改变原始列表中的对,请确保 head 复制数据。

head = lst[n - 1].copy()

满足您需求的快速解决方案是

inc_lst = [ [ x[0]+1 , x[1] ] for x in lst]

希望对你有所帮助

当你使用

head = lst[n - 1]

当你执行

时,你得到了引用 [3,1] 作为 head
head[0] += 1

您将 [[1,1], [2,1], [3,1]] 更改为 [[1,1],[2,1], [4,1]]

当你追加时,lst 得到了另一个 head 副本。

因此,del lst[0]后得到的结果是[[2,1], [4,1], [4,1]]

  1. lst = [[1,1], [2,1],[3,1]]
  2. n = len(lst) - n 将等于 3
  3. head = lst[n - 1] => head = lst[2] => head = [3, 1]
  4. head[0] += 1它换头了,head = [4, 1]
  5. lst.append(head) ,记住 lst = [[1, 1], [2, 1], [4, 1]]head = [4, 1] => [[1, 1], [2, 1], [4, 1], [4, 1]]
  6. del lst[0] => [[2, 1], [4, 1], [4, 1]]

无论如何,当 head 是 [3, 1] 然后你改变 head 它会自动改变 lst[n - 1]

此外,请尝试使用 http://www.pythontutor.com/visualize.html

如果需要逐步了解代码的工作原理,这是一个非常有用的工具。

这其实是编程初学者(比如我)中非常普遍的问题。其他问题已经回答了这个问题,但我只想提一下,这是 "value semantics vs reference semantics" 的情况。快速阅读此主题可能很有用,以避免将来出现此类错误。