Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets

Objets (valeurs) et variables

En Python, Aucun, nombres, fonctions, classes, méthodes, modules, etc. ** tous ** sont ** convertis ** en ** objets ** (instances de certaines classes). La ** variable ** contient le ** object id **, qui est la ** valeur de référence ** de l'objet **. Vous pouvez ** attribuer ** à n'importe quel objet. Vous pouvez également ** réattribuer ** des objets d'un type différent. ** Les variables ** sont stockées dans le ** dictionnaire de variables ** avec ** noms de variables ** comme clés de dictionnaire et ** object id ** comme valeurs de dictionnaire. Vous pouvez vérifier le contenu du ** dictionnaire de variables ** avec la fonction vars, la fonction locals et la fonction globals. ** List ** est un ** tableau ** de ** object id **. Vous pouvez également affecter / réaffecter des objets de types différents pour chaque élément du tableau.

Affectation / réaffectation de variable

image.png

>>> id(1)
15812500000
>>> type(1)
<class'int'>
>>> 1 .__class__    #Insérez un espace avant le point pour qu'il ne soit pas interprété comme un point décimal
<class'int'>
>>> 1 .real
1
>>> id(2)
15812500032
>>> a = 1
>>> id(a)
15812500000
>>> a = 2
>>> id(a)
15812500032
>>> vars()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class'_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
 'a': 2}

Affectation cumulative à des variables Partie 1: dans le cas d'objets immuables

Les affectations telles que «+ =» sont appelées affectations cumulatives. L'affectation cumulative en Python se comporte différemment selon que l'objet affecté à la variable est un objet immuable ou mutable. Pour les objets immuables tels que le type int, réaffectez un autre objet comme indiqué dans la figure ci-dessous.

image.png

>>> a = 2
>>> id(a)
15812500032
>>> a += 1
>>> id(a)
15812500064

Objet de liste

image.png

>>> id(1)
15812500000
>>> id(2)
15812500032
>>> id(3)
15812500064
>>> a = [1, 2, 3]
>>> id(a)
123145300973832
>>> type(a)
<class'list'>
>>> a.__class__
<class'list'>
>>> len(a)
3
>>> a.__len__()
3
>>> for ele in a:
...     print(ele, type(ele), id(ele))
...
1 <class'int'> 15812500000
2 <class'int'> 15812500032
3 <class'int'> 15812500064
>>> vars()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class'_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
 'a': [1, 2, 3],
 'ele': 3}

Affectation cumulative aux objets

image.png

>>> a = [1, 2, 3]
>>> id(a[0])
15812500000
>>> a[0] += 1
>>> id(a[0])
15812500032
>>> id(a[1])
15812500032

Notez que les valeurs entières (objets de type int) de -5 à 256 sont mises en cache comme des valeurs fréquemment utilisées et sont ** partagées et réutilisées **, donc ʻa [0]et ʻa [1]Les identifiants des objets sont les mêmes. Modèles de conception orientés objet (https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91 % E3% 82% BF% E3% 83% BC% E3% 83% B3_ (% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6% E3% 82% A7% E3% 82% A2)) "[modèle de poids mouche](https://ja.wikipedia.org/wiki/Flyweight_%E3%83%91%E3%82%BF%E3%83%BC%E3%83" % B3) ”est utilisé.

Affectation cumulative aux variables Partie 2: Dans le cas d'objets mutables

La liste étant un objet mutable, elle se comporte différemment d'un objet de type int. Comme le montre la figure ci-dessous, l'objet est invité à être traité et l'objet lui-même modifie le contenu de l'objet.

image.png

>>> a = [1, 2, 3]
>>> id(a)
123145300973832
>>> hasattr(a, '__iadd__')
True
>>> hasattr(2, '__iadd__')
False
>>> a += [4]
>>> id(a)
123145300973832
>>> len(a)
4
>>> a.__len__()
4
>>> id(a[3])
15812500096

référence

Déclaration d'affectation cumulative: https://docs.python.org/ja/3/reference/simple_stmts.html#augmented-assignment-statements Méthode d'affectation cumulative: https://docs.python.org/ja/3/reference/datamodel.html#object.iadd

Recommended Posts

Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Comment utiliser argparse et la différence entre optparse
Je ne suis pas sûr de la différence entre les modules, les packages et les bibliothèques, alors j'ai essayé de les organiser.
[Introduction à Python] Quelle est la différence entre une liste et un taple?
Quelle est la différence entre «pip» et «conda»?
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Comprendre l'espace de noms TensorFlow et les variables partagées principales
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Différence entre Ruby et Python en termes de variables
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
[Introduction au modèle des maladies infectieuses] Quelle est la différence entre l'épidémie d'avril et cette épidémie? .. .. ‼
Quelle est la différence entre les liens symboliques et les liens durs?
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
À propos des variables et des objets Python
Différence entre régression et classification
Je veux absorber la différence entre l'instruction for sur la matrice Python + numpy et l'instruction Julia for
"Copie profonde" et "Copie superficielle" à comprendre avec le plus petit exemple
J'ai essayé d'énumérer les différences entre java et python
Différence entre np.array et np.arange
Différence entre le processus de premier plan et le processus d'arrière-plan compris par principe
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
J'ai étudié le comportement de la différence entre lien dur et lien symbolique
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre == et est en python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Différence entre SQLAlchemy flush () et commit ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
Je souhaite séparer le traitement entre le temps de test et l'environnement de production
Comment obtenir la différence de date et d'heure en secondes avec Python
Rechercher le nom et les données d'une variable libre dans un objet fonction
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
Enregistrez les étapes pour comprendre l'apprentissage automatique
[Django ORM] Différence entre values () et only ()
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Python] Différence entre la méthode de classe et la méthode statique