2017-10-28 4 views
0

Nach dem Ausführen des folgenden Codes erwarte ich, dass hat und s hat. Warum fügt der Code stattdessen File in sowohlFolder s ein?Python: Warum werden beide Einträge in der Liste aktualisiert?

Code:

class Folder(object): 
    # __init__ 
    def __init__(self): 
     pass 

    list_of_files = [] 


class File(object): 
    # __init__ 
    def __init__(self): 
     pass 

    def insert_into_folder(self, folder): 
     folder.list_of_files.append(self) 


def main(): 
    folders = [] 
    folders.append(Folder()) 
    folders.append(Folder()) 

    f = File() 
    f.insert_into_folder(folders[0]) 

    for folder in folders: 
     print("Folder {:d} has {:d} file(s)".format(folders.index(folder), len(folder.list_of_files))) 


if __name__ == "__main__": 
    main() 

Ausgang:

Folder 0 has 1 file(s) 
Folder 1 has 1 file(s) 

Process finished with exit code 0 
+1

Alle Ordner teilen sich einen einzigen 'list_of_files' untereinander –

Antwort

1

Als einer der Kommentar sagt: Alle Ordner teilen sich eine einzige list_of_files untereinander.

daher in Ihrem Fall, dass Sie jeden Ordner wollen seine eigene Liste haben, deshalb brauchen Sie so etwas wie dies zu tun:

class Folder(object): 
    # __init__ 
    def __init__(self): 
     self.list_of_files = [] 


class File(object): 
    # __init__ 
    def __init__(self): 
     pass 

    def insert_into_folder(self, folder): 
     folder.list_of_files.append(self) 


def main(): 
    folders = [] 
    folders.append(Folder()) 
    folders.append(Folder()) 

    f = File() 
    f.insert_into_folder(folders[0]) 

    for folder in folders: 
     print("Folder {:d} has {:d} file(s)".format(folders.index(folder), len(folder.list_of_files))) 


if __name__ == "__main__": 
    main() 

Ausgabe

Folder 0 has 1 file(s) 
Folder 1 has 0 file(s) 

von self.list_of_files = [] Hinzufügen Sie Ich sage eigentlich immer, wenn ich eine Instanz von Folder mache, füge eine list_of_files zu dieser Instanz hinzu.

+0

Also das bedeutet alle (Instanz) Attribute einer Klasse sollte in' __init__' anstatt in den Körper der Klassendefinition initialisiert werden? – grendelsdad

1

list_of_files ist eine Klassenvariable und nicht eine Instanzvariable, was bedeutet, dass alle Folder ‚s die gleiche list_of_files haben. Fix, indem Sie dies in eine Instanzvariable ändern.

1

Wie Patrick wies darauf hin, wie du Folder definiert haben, list_of_files ist ein Klassenvariable, dh es ist „global“ auf die Klasse ist, und es gibt nur eine Kopie davon, unter allen Instanzen der Klasse geteilt.

Wenn Sie jeden Ordner wollen eine eigene Dateiliste haben, definieren Ordner wie folgt aus:

class Folder(object): 
    def __init__(self): 
     self.list_of_files = [] 
1

Sie benötigen eine Instanzvariable, nicht eine Klassenvariable.

class Folder(object): 
    # __init__ 
    def __init__(self): 
     self.list_of_files = [] 
Verwandte Themen