2016-05-24 10 views
0

self._insertInteral(value, self.root.rightChild)の引数のうちどれが値で参照されていますか?私はまだPythonを勉強していて、Pythonのオブジェクト方法論によるパスについて読んでいました。私はトピックに関する私の誤解が、バイナリツリーに挿入するための私の関数が値が挿入される結果にならない理由かもしれないと思う。Pythonのこれらの引数は値渡しか参照渡しですか?

class Node: 
    def __init__(self, leftChild, rightChild, value): 
     self.leftChild = leftChild 
     self.rightChild = rightChild 
     self.value = value 

class BinaryTree: 
    def __init__(self, root): 
     self.root = root 
    def _insertInternal(self, value, root): 
     if root is None: 
      root = Node(None, None, value) 
      print 'new node, root.value = ' + str(root.value) 
      return 
     if root.value > value: 
      self._insertInternal(value, root.leftChild) 
     else: 
      self._insertInternal(value, root.rightChild) 

    def insert(self, value): 
     print 'attempting to insert value = ' + str(value) 
     if self.root is None: 
      self.root = Node(None, None, value) 
      return 
     elif self.root.value > value: 
      print str(self.root.value) + '>' + str(value) 
      self._insertInternal(value, self.root.leftChild) 
     else: 
      print str(self.root.value) + '<' + str(value) 
      self._insertInternal(value, self.root.rightChild) 


if __name__ == '__main__': 
    root = Node(None, None, 10) 
    tree = BinaryTree(root) 
    print tree.root.leftChild 
    print tree.root.rightChild 
    print tree.root.value 


    tree.insert(5) 

    print tree.root.leftChild 
    print tree.root.rightChild 
    print tree.root.value 

私はチェックアウトこの記事Understanding Python's call-by-object style of passing function argumentsをしましたが、特にこの例に疑問を抱いた。

は、ここに私のコードです。

+1

いいえ、理由はありません。これを考慮してください。あなたのコードで実際に(適切な場所を見つけた後で)ノードをツリーに追加しますか? – donkopotamus

+1

あなたが投稿したリンクによれば、Pythonには値渡しや参照渡しはなく、オブジェクト渡しのみがあります。 – interjay

+1

( '=='を使用して 'なし'と比較しないで '' x 'なら ':' 'のように' 'を使用します) – donkopotamus

答えて

2

Pythonはpass by assignmentです。 BinaryTree._insertInternalroot引数(そのメソッドのscobe内のローカル変数)の割り当てには、最初にルートノードの値が割り当てられます(この場合、値はオブジェクト参照です)。root = Node(None, None, value)は新しい割り当てですしたがって、最初に渡されたものとは異なるため、インスタンスのself.rootとは異なります。

+0

リンクありがとうございます。私は今起こっていることを理解していると思います。 –

関連する問題