0

私は C++ コーダーです。最近Pythonを始めました。Python での単純なリンク リストの実装を見ていました。私はここで少し混乱しています。ここだけでなく、Tree 実装などでも同じ問題があります。

class Element には、データと次のノードへのポインタが含まれます。完璧で問題ありません。ただし、クラス LinkedList では、self.tail.next=e を確認できます。次に、Element クラスのオブジェクトがアクセスする必要があるよりも、パブリックであっても Element クラスの変数です。ここで、self.tail.next = e のように記述するにはどうすればよいでしょうか。私は混乱しています。

class Element:
        def __init__(self,x):
                self.data=x
                self.next=None


class LinkedList:
        def __init__(self):
                self.head=None
                self.tail=None

        def append(self,x):
                # create a new Element
                e = Element(x)
                # special case: list is empty
                if self.head==None:
                        self.head=e
                        self.tail=e
                else:
                        # keep head the same
                        self.tail.next=e
                        self.tail=e
4

5 に答える 5

4

Python は参照を処理します。すべては常に参照によって渡され、値は常に参照を介して共有されます (明示的にコピーされない限り)。

オブジェクトを割り当てるということは、そのオブジェクトへの参照を割り当てることを意味します。この方法self.tail.next = eは、self.tail が Element クラスのオブジェクトを参照することを期待していることを意味します。オブジェクトには .next 属性があります。これself.tail.next = eは、空でないリストの最後の要素が、追加されたばかりの新しい要素を指すことを意味します。次に、self.tail = e最後の要素への参照が、追加された最後の要素に移動されることを意味します。

Python の変数は、指定された名前の単なる参照変数です。自動的に逆参照されます。そのため、C++ などの古典的なコンパイル言語に慣れている人には奇妙に見えるかもしれません。

アカウントを作成しないと、Expert Exchange で記事を表示できるかどうかわかりません。はいの場合は、http://www.experts-exchange.com/Programming/Languages/Scripting/Python/A_6589-Python-basics-illustrated-part-2.html、つまりhttp://www.expertsをご覧ください。問題を説明する画像については、-exchange.com/Programming/Languages/Scripting/Python/A_7109-Python-basics-illustrated-part-3.htmlを参照してください。

于 2012-04-23T10:50:59.370 に答える
1

self.tail を初期化する唯一の場所は append で、そこで e と等しくなるように設定します。少し上にあるe = Element(x)ので、eElement 型のオブジェクトです。呼び出した瞬間に、self.tail.next=ehead が none ではなく、tail も None ではなく Element のインスタンスであることがわかることに注意してください。

お役に立てれば。

于 2012-04-23T10:37:25.643 に答える
1

あなたが書いた:

次は、パブリックであっても、Element クラスのオブジェクトがアクセスする必要があるよりも、Element クラスの変数です。

そこには誤解があります。パブリック メンバー (つまり、2 つのアンダースコアで始まるメンバーを除くすべてのメンバー) は、同じクラスのメソッド内からだけでなく、どこからでもアクセスできます。

于 2012-04-23T10:37:52.563 に答える
0

Pythonではすべてが参照です。

お願い: リストの実装を (アプリケーションの) データから分離してください。

C++ と同様に、アクセス メソッドをカプセル化するのは良いスタイルですが、インスタンス フィールドへのアクセス制限がないため、どこからでもアクセスできます。

一般的な二重連結リストのアイデア (これは強化すべきスケルトンにすぎませんが、アイデアが伝わることを願っています)。

class DoubleLinkedList(object):

    class ListNode(object):

        def __init__(self):
            self.__next = None
            self.__prev = None

        def next(self):
            return self.__next

        def prev(self):
            return self.__prev

        def set_next(self, next_node):
            self.__next = next_node

        def set_prev(self, prev_node):
            self.__prev = prev_node

        def is_last(self):
            return self.next()==None

    def __init__(self):
        '''Sets up an empty linked list.'''
        self.__head = DoubleLinkedList.ListNode()
        self.__tail = DoubleLinkedList.ListNode()
        self.__head.set_next(self.__tail)
        self.__tail.set_prev(self.__head)

    def first(self):
        return self.__head.next()

    def last(self):
        return self.__tail.prev()

    def append(self, list_node):
        list_node.set_next(self.__tail)
        list_node.set_prev(self.__tail.prev())
        self.__tail.set_prev(list_node)
        list_node.prev().set_next(list_node)

########################################

class MyData(DoubleLinkedList.ListNode):
    def __init__(self, d):
        DoubleLinkedList.ListNode.__init__(self)
        self.__data = d

    def get_data(self):
        return self.__data

ll = DoubleLinkedList()

md1 = MyData(1)
md2 = MyData(2)
md3 = MyData(3)

ll.append(md1)
ll.append(md2)
ll.append(md3)

node = ll.first()
while not node.is_last():
    print("Data [%s]" % node.get_data())
    node = node.next()
于 2012-04-23T12:20:37.680 に答える
0

nextそしてtail 要素です。それが理由です。これは、C や C++ を含む任意の言語の連結リストに当てはまります。 リンクされたリストは、ポインター/参照でリンクされた要素のリストです。

リストがトラバースされるとき、それらのリンクはノード (要素) からノードへの取得に使用されます。他のリンクされたリストを参照しても意味がありませんね。リストの最初の要素はhead、最後の要素はtailnextノードで指されている要素はリストの後の要素、previousノードはその前の要素です。

于 2012-04-23T10:29:44.257 に答える