python - 为什么我的列表中会发生这种奇怪的事情?
问题描述
我有一个列表,我想在我的列表中反向遍历并用前一个元素更改每个元素,直到第一个元素:
lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
lst[i] = lst[i-1]
lst[0][0] += 1
之后,这是我期望的结果:
>>> lst
[[2, 2], [1, 2], [1, 3], [1, 4]]
但结果是这样的:
>>> lst
[[2, 2], [2, 2], [1, 3], [1, 4]]
当您将它们分配给彼此时,我听说过有关在 2 个列表之间进行引用的信息,但问题是为什么其他元素不会发生此结果,例如:
lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
lst[i] = lst[i-1]
lst[2][0] += 1
这是结果:
>>> lst
[[1, 2], [1, 2], [2, 3], [1, 4]]
我的期望:
>>> lst
[[1, 2], [1, 2], [2, 3], [2, 4]]
lst[2]
为什么and之间没有任何引用lst[3]
?
解决方案
让我们给您的子列表单独命名,因此您的列表最初是
lst = [a, b, c, d]
现在你执行这个循环:
for i in range(len(lst) - 1, 0, -1):
lst[i] = lst[i-1]
在每一步,这就是你得到的:
# lst[3] = lst[2]
[a, b, c, c]
# lst[2] = lst[1]
[a, b, b, c]
# lst[1] = lst[0]
[a, a, b, c]
现在你最终得到lst[0]
并lst[1]
成为同一个对象,所以当你在内部进行更改时,lst[0]
你会看到相同的更改lst[1]
推荐阅读
- c# - C# 仅当列表中存在列名时才从 CSV 文件中读取列
- wordpress - WooCommerce“产品类别列表”小部件似乎无法从可用小部件列表中选择
- flutter - 提供导航功能后对话框不消失
- lua - 如何在 LUA 5.1 Touchosc 中使用变量
- python - 我在 VS Code 中使用相同的 py 文件来学习不同的示例。为什么我删除并编写不同的代码后它仍然运行第一块代码?
- java - java JFrame更新调整窗口大小,但不是自己
- django - Django DRF ModelSerializer 错误验证关系字段我得到字段是必需的,但所有字段在请求数据中都有值
- c - linux C程序中对“函数”的未定义引用
- java - 我正在用java编写一个函数,它将第一个字符放在第三位,只要单词是,它每三个字符重复一次
- reactjs - 如何更改图表中的图例文本颜色