繁体   English   中英

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

[英]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 = lst[n - 1].copy()

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

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

希望它会有所帮助

当你使用

head = lst[n - 1]

当您执行时,您将参考 [3,1] 作为头部

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, 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

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

这实际上是编程初学者(比如我自己)中非常普遍的问题。 其他问题已经回答了这个问题,但我只想提一下,这是“值语义与引用语义”的一个案例。 为了避免将来出现此类错误,简要阅读此主题可能会很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM