web-dev-qa-db-fra.com

les variables de classe sont partagées entre toutes les instances en python?

J'ai commencé à coder en python il y a une semaine, c'est mon erreur j'ai commencé à coder en utilisant des oups, des classes et des objets aussi rapidement. J'ai supposé que mes compétences en C++ m'aideraient .... code suivant

class A:
     var=0
     list=[]
     def __init__(self):
            pass

Ici, à ma grande surprise, var et list sont un peu une variable globale, il est partagé entre toutes les instances, il semble .... Ce que je pensais était différent entre toutes les instances ..... Cela m'a pris une demi-journée pour comprendre cela .... Cela n'a aucun sens, même si une variable est accessible uniquement par un objet de classe, mais qu'elle est partagée entre toutes les instances ....... Juste curieux, y a-t-il une raison derrière cela ??? ??

26
howtechstuffworks

var ne doit certainement pas être partagé tant que vous y accédez par instance.var ou self.var. Avec la liste cependant, ce que fait votre instruction, c'est lorsque la classe est évaluée, une instance de liste est créée et liée à la classe dict, donc toutes les instances auront la même liste. Chaque fois que vous définissez instance.list = somethingelse resp. self.list = somethingelse, il devrait obtenir une valeur au niveau de l'instance.

Exemple de temps:

>>> class A():
...     var = 0
...     list = []
...
>>> a = A()
>>> b = A()
>>> a.var
0
>>> a.list
[]
>>> b.var
0
>>> b.list
[]
>>> a.var = 1
>>> b.var
0
>>> a.list.append('hello')
>>> b.list
['hello']
>>> b.list = ['newlist']
>>> a.list
['hello']
>>> b.list
['newlist']
28
mensi

Ce sont essentiellement des variables statiques en Java:

// Example equivalent Java
class A {
    static int var = 0;
    static String[] list;
}

Voici le comportement recherché: les variables de classe sont pour la classe .

Pour les variables d'instance normales, déclarez-les dans le constructeur:

class A:
    def __init__(self):
        self.var = 0
        self.list = []

Vous voudrez peut-être regarder Variables de classe statiques en Python .

15
Brendan Long

La raison en est que dans Python class est une instruction exécutable qui est exécutée comme n'importe quelle autre. Le corps de la définition de classe est exécuté une fois, lorsque la classe est définie. Si vous avoir une ligne ligne var = [] là-dedans, alors il n'est exécuté qu'une seule fois, donc une seule liste peut être créée à la suite de cette ligne.

5
BrenBarn

Notez que vous ne voyez pas ce comportement pour var, vous ne le voyez que pour list:

>>> class A:
...     var = 0
...     list = []
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0
2
Simeon Visser