Les mines terrestres cachées dans les variables de classe Python

https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables

Class variables Python are strange. If they are mutable, they act like STATIC PROPERTY in PHP; If they are immutable, when they reassigned, the act like DYNAMIC PROPERTY in PHP. It seems to do with reference.

class X:
    array: list = []
    immutable_array: tuple = ()
    static_v: str = 'ori'

    def __init__(self, name: str):
        self.name = name

    def init_ext(self):
        self.array = []  
        # or even use [self.name], just let it be another id

    def work(self):
        self.array.append(self.name)
        self.immutable_array = (len(self.array),)
        self.static_v = f"[{self.name}]"


if __name__ == '__main__':
    x1 = X("A")
    x2 = X("B")

    for i in range(3):
        print("x1 array: ", x1.array, 'tuple: ', x1.immutable_array, "v: ", x1.static_v),
        print("x1[id] array: ", id(x1.array), 'tuple: ', id(x1.immutable_array), "v: ", id(x1.static_v))
        print("x2 array: ", x2.array, 'tuple: ', x2.immutable_array, "v: ", x2.static_v)
        print("x2[id] array: ", id(x2.array), 'tuple: ', id(x2.immutable_array), "v: ", id(x2.static_v))
        x1.work()
        x2.work()

    print("finally")
    print("x1 array: ", x1.array, 'tuple: ', x1.immutable_array, "v: ", x1.static_v),
    print("x1[id] array: ", id(x1.array), 'tuple: ', id(x1.immutable_array), "v: ", id(x1.static_v))
    print("x2 array: ", x2.array, 'tuple: ', x2.immutable_array, "v: ", x2.static_v)
    print("x2[id] array: ", id(x2.array), 'tuple: ', id(x2.immutable_array), "v: ", id(x2.static_v))

Output:

x1 array:  [] tuple:  () v:  ori
x1[id] array:  4477451776 tuple:  4475306048 v:  4477483952
x2 array:  [] tuple:  () v:  ori
x2[id] array:  4477451776 tuple:  4475306048 v:  4477483952
x1 array:  ['A', 'B'] tuple:  (1,) v:  [A]
x1[id] array:  4477451776 tuple:  4476906464 v:  4477621936
x2 array:  ['A', 'B'] tuple:  (2,) v:  [B]
x2[id] array:  4477451776 tuple:  4476375872 v:  4477622000
x1 array:  ['A', 'B', 'A', 'B'] tuple:  (3,) v:  [A]
x1[id] array:  4477451776 tuple:  4476751488 v:  4477622064
x2 array:  ['A', 'B', 'A', 'B'] tuple:  (4,) v:  [B]
x2[id] array:  4477451776 tuple:  4476906464 v:  4477621936
finally
x1 array:  ['A', 'B', 'A', 'B', 'A', 'B'] tuple:  (5,) v:  [A]
x1[id] array:  4477451776 tuple:  4476375872 v:  4477622128
x2 array:  ['A', 'B', 'A', 'B', 'A', 'B'] tuple:  (6,) v:  [B]
x2[id] array:  4477451776 tuple:  4476751488 v:  4477622064

If you execute init_ext after initialization, the result changed.


x1 = X("A")
x2 = X("B")

x1.init_ext()
x2.init_ext()

# the same test codes as above

The output would be :

x1 array:  [] tuple:  () v:  ori
x1[id] array:  4327900992 tuple:  4325756992 v:  4327930800
x2 array:  [] tuple:  () v:  ori
x2[id] array:  4327899904 tuple:  4325756992 v:  4327930800
x1 array:  ['A'] tuple:  (1,) v:  [A]
x1[id] array:  4327900992 tuple:  4327849648 v:  4328077168
x2 array:  ['B'] tuple:  (1,) v:  [B]
x2[id] array:  4327899904 tuple:  4327372112 v:  4328077232
x1 array:  ['A', 'A'] tuple:  (2,) v:  [A]
x1[id] array:  4327900992 tuple:  4326822720 v:  4328077296
x2 array:  ['B', 'B'] tuple:  (2,) v:  [B]
x2[id] array:  4327899904 tuple:  4327849648 v:  4328077168
finally
x1 array:  ['A', 'A', 'A'] tuple:  (3,) v:  [A]
x1[id] array:  4327900992 tuple:  4327372112 v:  4328077232
x2 array:  ['B', 'B', 'B'] tuple:  (3,) v:  [B]
x2[id] array:  4327899904 tuple:  4326822720 v:  4328077296

Recommended Posts

Les mines terrestres cachées dans les variables de classe Python
classe de cas en python
Notation de classe en Python
[python] Différence entre variable et self. Variable dans la classe
Python: variables de classe et d'instance
Gérer les variables d'environnement en Python
Variables de classe et d'instance Python
Variable de classe
Lire des morceaux PNG en Python (édition de classe)
[Python] Variables
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
Utilisation de variables globales dans les fonctions python
Variable de classe
Examiner la classe d'un objet avec python
[Python] Hériter d'une classe avec des variables de classe
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Générer une collection de première classe en Python
[Python3] Définir dynamiquement des variables globales dans une fonction
[Introduction à Python] Comment utiliser la classe en Python?
Implémenter __eq__ etc. de manière générique dans la classe Python
Comment définir dynamiquement des variables en Python
Classe Trump en Python (avec comparaison)
Pour référencer des variables d'environnement en Python dans Blender
Comment utiliser __slots__ dans la classe Python
Générer une classe à partir d'une chaîne en Python
Des chercheurs de sociétés pharmaceutiques ont résumé les variables en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
"Kanrika" la classe python
Méta-analyse en Python
Unittest en Python
À propos de python, classe
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
classe python, instance
Constante en Python
nCr en Python.
format en python