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.
>>> 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}
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.
>>> a = 2
>>> id(a)
15812500032
>>> a += 1
>>> id(a)
15812500064
>>> 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}
>>> 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é.
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.
>>> 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
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