Saya memiliki kode python berikut yang menetapkan akar pohon AVL ke nilai yang ditentukan. Tetapi tampaknya pengaturan variabel root kelas tidak berpengaruh ketika dilakukan dengan melewatkannya melalui fungsi di kelas yang sama.

class AVLTree:
    class AVLNode:
        def __init__(self, value) -> None:
            self.value = value

    def __init__(self) -> None:
        self._root = None

    def insert(self, value: int) -> None:
        return self._insert(value, self._root)

    def _insert(self, value, node):
        if node is None:
            node = value
        return


avl = AVLTree()
avl.insert(5)
print(avl._root)

Cetakan None

Tampaknya meneruskan variabel kelas self._root sebagai parameter ke metode anggota tidak mengubah nilainya.

Saya membaca bahwa python melewati semua anggota kelas dengan referensi dan hanya tipe yang tidak dapat diubah (int, dll.) sebagai nilai.

Adakah yang tahu mengapa saya tidak dapat mengubah nilai self._root dalam fungsi _insert dan bagaimana saya bisa melakukannya? Terima kasih

0
Help Helper 6 Juli 2020, 17:29

1 menjawab

Jawaban Terbaik

Anda memiliki kendali penuh atas cara _insert dipanggil. Jangan menyebutnya dengan node=None. Sesuatu seperti

def insert(self, value: int) -> None:
    if self._root is None:
        self._root = self.AVLNode(value)
    else:
        self._insert(value, self._root)

def _insert(self, value, node):
    # Assume node is not None
    ...

(Tidak terkait, kelas AVLNode Anda juga harus menyimpan pointer ke dua anaknya, dan _insert perlu memperbaruinya dengan tepat.)

1
chepner 6 Juli 2020, 14:41