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

Posted

技术标签:

【中文标题】为啥将列表元素分配给变量在这里以不同的方式工作?【英文标题】:Why does assiging a list element to a variable work in a different manner here?为什么将列表元素分配给变量在这里以不同的方式工作? 【发布时间】:2019-12-29 23:19:28 【问题描述】:

我有这段代码:

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].copy()复制最后一个元素 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

快速解决您的需求是

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

希望对你有帮助

【讨论】:

【参考方案3】:

当你使用

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

【讨论】:

【参考方案4】:
    lst = [[1,1], [2,1],[3,1]] n = len(lst) - n 将等于 3 head = lst[n - 1] => head = lst[2] => head = [3, 1] head[0] += 1它换头,head = [4, 1] lst.append(head) ,记住 lst = [[1, 1], [2, 1], [4, 1]]head = [4, 1] => [[1, 1], [2, 1], [4, 1], [4, 1]] del lst[0] => [[2, 1], [4, 1], [4, 1]]

不管怎样,当 head 是 [3, 1] 然后你改变 head 并且它会自动改变 lst[n - 1]

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于为啥将列表元素分配给变量在这里以不同的方式工作?的主要内容,如果未能解决你的问题,请参考以下文章

简单的 Python 问题:为啥我不能将变量分配给排序列表(就地)? [复制]

尝试使用prolog将变量分配/提取到列表列表中的不同元素

将列表元素分配给变量

多次引用数组中的元素并将该元素分配给变量[重复]

无法将 128 分配给字节,为啥它会出错而不是溢出?

Liquid:如何将运算符的输出分配给变量?