2016-07-20 13 views
0

Mein Verständnis von Pythons veränderbarer Funktion für Klassen/Objekte ist, dass, wenn Sie eine Zuweisung machen, jede Änderung am Original auch die zugewiesene Variable/das Objekt ändert. Ich habe darüber verwirrt piece of code below.Wann beeinflusst die Änderbarkeit von Python-Klassenobjekten Zuweisungen?

# Recursive solution to Flatten Binary Tree to Linked List by LeetCode 

# Definition for a binary tree node 
# class TreeNode: 
#  def __init__(self, x): 
#   self.val = x 
#   self.left = None 
#   self.right = None 

class Solution: 
    # @param root, a tree node 
    # @return root, a tree node 
    def flattenHelper(self, root): 
     if root == None: 
      return None 
     else: 
      left = root.left 
      right = root.right 
      root.left = None # Truncate the left subtree 
      current = root 

      # Flatten the left subtree 
      current.right = self.flattenHelper(left) 
      while current.right != None: current = current.right 

      # Flatten the right subtree 
      current.right = self.flattenHelper(right) 
      return root 

    # @param root, a tree node 
    # @return nothing, do it in place 
    def flatten(self, root): 
     self.flattenHelper(root) 
     return 

Frage: Wie kommen die Variable left nicht automatisch None einmal root.left = None fertig ausgeführt wird?

+1

root.left = None setzt den Namen root.left, um an None zu binden. Es ändert nichts an dem, an das es gebunden ist. Der Knoten existiert also immer noch, da etwas darauf verweist. es ist nur, dass root.left es nicht mehr referenziert –

+0

@joelgoldstick Danke, aber ich bin immer noch verwirrt: Wenn ich Folgendes tue: test = root, root.left = TreeNode (5), test.left .val wird jetzt 5 Warum passiert das gleiche nicht oben? – user6175310

+0

@joelgoldstick Ich dachte etwas Ähnliches wie die Veränderlichkeit von Listen passiert hier: wenn ich a = [1,2,3] habe, dann definiere b = a, wenn ich jetzt a [0] = 0 ändere, wird b [0] ändert sich auch automatisch. Ich habe das mit Objekten versucht, wie im obigen Beispiel, und eine ähnliche Sache ist passiert. Ich verstehe nicht, was an der Implementierung dieses Codes anders ist, dass links nicht automatisch auf None gesetzt wird. – user6175310

Antwort

2

Zuweisung in Python funktioniert immer auf die gleiche Weise. Es ändert das Ding auf der linken Seite des = Zeichen, um auf den Wert des Ausdrucks auf der rechten Seite zu verweisen. Es gibt absolut überhaupt nichts "anders in der Implementierung", wie Sie in einem Kommentar fragen.

Manchmal ist das Element auf der linken Seite ein Slot in einem Container (eine Liste, ein Wörterbuch, ein Objekt). Diese Objekte sind veränderbar (können geändert werden), sodass Sie ändern können, worauf sich ihre Slots beziehen. Wenn Sie das tun, zum Beispiel:

a = b = [0] 

Jetzt a und b sind zwei verschiedene Namen für das gleiche Objekt. Wenn Sie a[0] = 1 tun, wird b[0] auch 1, weil a und b das gleiche Objekt sind, und die Zuweisung ändert dies nicht, weil Sie Slot 0 innerhalb des Objekts zuweisen, das von a referenziert wird; Sie ändern nicht, was a sich bezieht. Aber wenn Sie stattdessen a = [1] tun, dann bleibt b[0] 0, weil a jetzt auf eine andere Liste von b zeigt.

Dies ist, was in Ihrem Beispiel passiert. Die Namen left und root.left verweisen zunächst auf das gleiche Objekt. Wenn Sie root.left ändern, um auf ein anderes Objekt zu verweisen, wird left nicht geändert, um auf dasselbe Objekt zu zeigen. Um das zu erreichen, würde left haben einen Behälter sein, und es wäre nichtroot.left, der gleiche Behälter wie root, sein und wäre left.left was würde sich ändern, nicht left selbst. Weil Sie den Wert eines Namens nicht anders als durch Zuweisung ändern können.

+0

Danke! Also im Grunde, wenn statt root.left zu None zugewiesen wurde, wurde eine Änderung an dem Objekt vorgenommen (zB 'root.left.left = None', dann würde sich das ändern links --->' left.left' würde auch zu 'None' ') Ist das korrekt? – user6175310

+0

So ähnlich. Als Faustregel gilt, dass Sie nur dann eine Änderung an einem Objekt sehen, die sich in einem anderen Objekt widerspiegelt, wenn die Zuordnung zu einem Slot innerhalb eines Objekts erfolgt (z. B. ein Listen- oder Wörterbuchelement oder ein Objektattribut) und nur dann Die andere Referenz bezieht sich auf das gleiche Objekt (oder ein Elternobjekt, um vollständig zu sein). – kindall

+0

Vielen Dank !!! Ihre Beispiele und Erklärungen sind so klar und hilfreich !! – user6175310

Verwandte Themen