2

なぜ次のことがうまくいかないのか疑問に思っています。

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

これは私には論理的に思えます。ただし、最初のコード ブロックが期待どおりに機能しない理由はわかりません。

4

1 に答える 1

1

うまくいかない理由を説明します。しかし、最初に知っておく必要があるのは、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 つ戻ります。このようにして、リンクされたリストであるかのようにリストを簡単に操作し、空の要素を心配することなく要素を削除できます。スロット。これに加えて、list には、append、remove、sort、shuffle などの非常に便利なメソッドがいくつかあります。ドキュメントを見てください https://docs.python.org/3.5/library/stdtypes.html?highlight=list#list

質問に戻ります: remove メソッドを見てみましょう

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 で何が削除されたかどうかを気にする必要はありません。

于 2014-05-25T11:22:00.617 に答える