首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改一个列表,修改另一个列表,甚至使用list2=list(list1)

修改一个列表,修改另一个列表,甚至使用list2=list(list1)
EN

Stack Overflow用户
提问于 2021-12-02 12:28:56
回答 2查看 60关注 0票数 2

我按照以下两个链接来解决我的问题:firstsecond

我的剧本如下:

代码语言:javascript
运行
复制
list0=[[0,1,2],[3,4,5],[5,6,7]]
list2=list(list0)
list2[0][0]=20
print(list0) # displays [[20, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2) # displays [[20, 1, 2], [3, 4, 5], [5, 6, 7]]

如您所见,修改我的list2修改以及list0。但是,我注意到使用函数list()创建了list2。它不应该创建一个真正的新列表吗?

我不明白为什么它在这里行不通。

另一方面,它下面的另一个例子起作用了:

代码语言:javascript
运行
复制
list0=[[0,1,2],[3,4,5],[5,6,7]]
list2=list(list0)
list2[0]=[20,30,40]
print(list0) # prints [[8, 9, 10], [3, 4, 5], [5, 6, 7]]
print(list2) # prints [[20, 30, 40], [3, 4, 5], [5, 6, 7]]: Good !

我的问题:

为什么它在第一个示例中不起作用,而在第二个示例中工作呢?如何确保没有这个问题,并“真正”创建一个新的列表,如果我修改这个新的,旧的将永远不会被修改,无论在这个旧列表中有什么。

是因为list2和list0指向不同的元素。因此,修改list2i不会修改list0i。但是,list2i和list0i指向同一个列表,因此修改list2i将修改list0i?在某种程度上,我在某些层次上创建了不同的引用,但不是为所有级别创建的引用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-02 12:45:28

这里的问题是,虽然list2 = list(list0)使外部列表在两个实例之间有所不同,但所有内部列表仍然相同。要避免这种情况,可以使用copy.deepcopy

代码语言:javascript
运行
复制
from copy import deepcopy

list0 = [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
list2 = deepcopy(list0)
list2[0][0] = 20
print(list0)  # [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2)  # [[20, 1, 2], [3, 4, 5], [5, 6, 7]]

或嵌套列表理解:

代码语言:javascript
运行
复制
list0 = [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
list2 = [list(sublist) for sublist in list0]
list2[0][0] = 20
print(list0)  # [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2)  # [[20, 1, 2], [3, 4, 5], [5, 6, 7]]

但请注意,如果嵌套深度不同,则必须调整后一种方法。

票数 2
EN

Stack Overflow用户

发布于 2021-12-02 12:31:23

不,list()将其参数转换为列表。因此,您将list2作为引用list0的变量。你要找的是copy()

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70199472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档