2016-05-24 108 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

(不要使用'=='比較None,使用'is'(如'if x is None:...')) – donkopotamus

回答

2

Python是pass by assignment。在BinaryTree._insertInternal之內,root參數的分配(也是該方法的scobe內的局部變量)最初被分配了根節點的值(在這種情況下,該值是對象引用),並且語句root = Node(None, None, value)是一個新的分配,因此它變得與最初通過的不同,因此與實例的self.root不同。

+0

感謝您的鏈接。我想我明白現在發生了什麼。 –

相關問題