首先看看我的Python代码,
s = [[1, 2], [3, 6], [9, 6]]
t = s
i = s[0]
del i
del t[0]对于2,1;t,s和"i“有三个引用,所以如果我们尝试删除它们,它不应该影响到1,2,因为1,2仍然有另外两个引用,因此Python垃圾收集系统不会删除对没有引用的1,2做。所以为什么删除"i“对1,2不起作用,而删除t对1,2有影响。
发布于 2022-08-19 08:12:49
您错误地理解了del语句的功能。对于变量名称:
del variable_namedel语句从全局变量中删除名称与对象的绑定。
用于容器和密钥的组合:
del container[key]它负责根据密钥删除容器中的元素。
用一些简单的符号来解释你在做什么。在这里,我使用一对括号来表示对象,而单词ref或变量名则表示引用。在创建这些对象之后,它将如下所示:
t s
↓ ↓
(list [ref, ref])
i ┌───┘ └───────┐
↓ ↓ ↓
(list [ref, ref]) (list [ref, ref])
┌───┘ ┌─┘ ┌──────┘┌───┘
↓ ↓ ↓ ↓
(int 1) (int 2) (int 3) (int 6)如果执行del i,最终结果如下:
t s
↓ ↓
(list [ref, ref])
┌───┘ └───────┐
↓ ↓
(list [ref, ref]) (list [ref, ref])
┌───┘ ┌─┘ ┌──────┘┌───┘
↓ ↓ ↓ ↓
(int 1) (int 2) (int 3) (int 6)如果执行del t[0],最终结果如下:
t s
↓ ↓
(list [ref])
i └────────────┐
↓ ↓
(list [ref, ref]) (list [ref, ref])
┌───┘ ┌─┘ ┌──────┘┌───┘
↓ ↓ ↓ ↓
(int 1) (int 2) (int 3) (int 6)发布于 2022-08-19 07:25:18
将注释转换为答复。
设置等于花药列表的变量不复制列表,它只在内存中设置引用。编辑引用时,编辑原始列表。使用复制模块实际复制列表。
示例:
import copy
s = [[1, 2], [3, 6], [9, 6]]
t = copy.copy(s)
del t[0]
print(s)
print(t)结果:
[[1, 2], [3, 6], [9, 6]]
[[3, 6], [9, 6]]Note
copy.copy()是一个浅拷贝,它构造一个新的复合对象,然后(尽可能)将对原始对象的引用插入其中。
copy.deepcopy()是一个深拷贝,它构造一个新的复合对象,然后递归地将原始对象中的副本插入其中。
发布于 2022-08-19 07:34:27
i = s[0]将i设为1,2。所以,当使用del i时,我们有i= 1,2,这不影响原始列表。它仅影响变量i,如果要删除列表s中的第一项,只需执行以下操作:
del s[0]但是,请注意,在这种情况下使用remove()更好,因为remove()的时间复杂度是O(n),其中n是元素的数量,del的时间复杂度是O(n-1),其中是要删除的元素的索引。
https://stackoverflow.com/questions/73413164
复制相似问题