为啥将列表元素分配给变量在这里以不同的方式工作?
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】:这实际上是编程初学者(例如我自己)中非常普遍的问题。其他问题已经回答了这个问题,但我只想提一下,这是“值语义与引用语义”的一个案例。简要阅读此主题可能会很有用,以避免将来出现此类错误。
【讨论】:
以上是关于为啥将列表元素分配给变量在这里以不同的方式工作?的主要内容,如果未能解决你的问题,请参考以下文章