Skip to main content
 首页 » 编程设计

python之Python 中 del 运算符的行为

2025年05月04日6mfryf

我想知道为什么以下内容不起作用。

class Node(object): 
    def __init__(self, data, next=None): 
        self.data = data 
        self.next = next 
 
    def remove(self, value): 
        if self is None: 
            return False 
        if self.data == value: 
            if self.next: 
                self.data = self.next.data 
                self.next = self.next.next 
            else: 
                del self 
        else: 
            self.next.remove(value) 
 
    node = Node(4) 
    node.append(Node(3)) 
    node.remove(3) 
    print node.next.data 
    #prints 3 

del 不会从链表中删除元素。我必须修改 delete() 函数,以便我有一个指向目标元素父元素的指针。

class Node(object): 
    def __init__(self, data, next=None): 
        self.data = data 
        self.next = next 
 
    def remove(self, value): 
        if self is None: 
            return False 
        if self.data == value: 
            if self.next: 
                self.data = self.next.data 
                self.next = self.next.next 
            else: 
                del self 
        else: 
            current = self 
            while current.next: 
                if current.next.data == value: 
                    if current.next.next: 
                        current.next = current.next.next 
                    else: 
                        current.next = None 

从控制台,

node = Node(4) 
current = node 
del current #node is not deleted because I am only deleting the pointer 
del node #node is deleted 

这对我来说似乎合乎逻辑。但是,我不确定为什么第一个代码块无法按预期工作。

请您参考如下方法:

我会解释为什么它不起作用。但首先您需要知道,您很少需要在 Python 中创建链表,因为列表类型已经为您提供了几乎所有内容。

>>> [2*i for i in range(10)] 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
>>> list_1=[2*i for i in range(10)] 
>>> i=0 
>>> list_1[i]#first 
0 
>>> i=i+1 
>>> list_1[i]#next 
2 
>>> list_1[-1]#last 
18 
>>> len(list_1)#size 
10 
>>> del list_1[-1]# del the last 
#delete all (list_1 becomes empty) 
for i in range(len(list_1)): 
    del list_1[0] 

在结束循环中,我们只删除前 n 次,但是当您删除列表中的第一个时,另一个对象返回 1 个位置。这样您就可以轻松地操作列表,就好像它们是链表一样,并删除任何元素而不必担心关于一个空槽。除此之外,列表还有几个非常有用的方法,如追加、删除、排序、随机播放等等。查看文档 https://docs.python.org/3.5/library/stdtypes.html?highlight=list#list

现在回到你的问题: 让我们看看您的删除方法

if self is None: 
    return False 

这是没有用的,你只能用一个有这个方法的对象来调用.remove。 None.remove() 从不工作。如果 self 是 None 它将在任何(不可能的)调用之前抛出错误。

else: 
    del self 

当您在对象的方法中看到 self 时,它只是对对象本身的引用,del sel 只会删除本地引用。如果你真的想销毁一个对象,你必须在每个引用上用 del 销毁它。如果没有活变量在查看它,Python 将忘记您的对象。您也可以覆盖引用。

>>> node = Node(4) 
>>> node = 3# the Node object is erased because you can t have access to it 

总的来说,除了创建链接列表之外,我并没有真正理解您的 Node 类的目标,但正如我所说,您可以使用 list() 来实现。通常,您不需要关心在 Python 中删除了什么或没有删除什么,因为如果没有对对象的引用,Python 将覆盖内存。