À propos de la référence Python

Trébucher en Python

Comme indiqué dans les commentaires, il n'y a pas de passage par référence en Python en premier lieu. Reportez-vous à l'article suivant. https://qiita.com/raccy/items/d4c5e7995a8fc90109ee#_reference-de4299be58ab9d936fcb

Il y a des inexactitudes dans cet article, en partie parce que je l'ai écrit alors que je manquais clairement de compréhension, mais je voudrais le laisser comme un mémo sur la façon dont j'ai fait face aux questions que j'avais à ce moment-là (laisser un mémo). Peut-être pas bon).

Le mystère du passage par référence

Quand j'ai commencé python pour la première fois, la première chose sur laquelle je suis tombé par hasard était la mystérieuse explication que l'on voit souvent partout: «Tous les arguments de python sont passés par référence». J'ai en quelque sorte compris le passage par référence. Cependant, si vous exécutez le code suivant avec python, ...

>>> a=1
>>> b=a
>>> b=2
>>> print(a,b)
1,2

Sera. Eh bien, je pense que c'est naturel, mais je ne suis pas convaincu si c'est passé par référence (il semble naturel que je n'étais pas convaincu car il n'a pas été adopté par référence en premier lieu). Parce que si tu passes par référence

>>> a=1
>>> b=a
>>> b=2
>>> print(a,b)
2,2  

Parce qu'il devrait l'être (cette compréhension à ce moment-là semble avoir été correcte). Je pensais: "Si b = a par référence, alors si b et a partagent la même mémoire et que b est réécrit, alors a sera également réécrit." En fait, si vous faites quelque chose de similaire dans la liste, c'est ce qui se passe.

>>> a=[1,2,3]
>>> b=a
>>> b[0]=5
>>> print(a,b)
#[5,1,2],[5,1,2] 

S'il est passé par référence, ce sera le comportement. Autrement dit, ceux qui peuvent contenir plusieurs éléments sont passés par référence, et je me suis demandé si seul le type numérique était différent, et quand je vérifie les emplacements mémoire de a et b avec le code suivant, ...

>>> a=1
>>> b=a
>>> print(id(a)==id(b))
True
>>> b=2 
>>> print(id(a)==id(b))
False

Par conséquent, lorsque b = a, b et a se réfèrent au même endroit. Cependant, si b = 2, b fera référence à l'emplacement de l'objet int nouvellement créé avec la valeur 2. D'autre part, a continue de faire référence à l'emplacement d'origine. Je comprends. Mais cette fois, l'exemple de liste est plus déroutant. Alors, quand je regarde ça

>>> a=[1,2,3]
>>> b=a
>>> a_0=a[0] 
>>> b[0]=5
>>> print(a[0])
5
>>> print(id(a)==id(b))
True
>>> print(id(a[0])==id(a_0))
False 
>>> b=[4,5,6]
>>> print(id(a)==id(b))
False

J'en suis enfin convaincu. En d'autres termes.

  1. Au moment de b = a, b se réfère également au même endroit que a
  2. Si b [0] = 5, un nouvel objet int avec une valeur de 5 sera créé et b [0] se référera à nouveau à cet emplacement.
  3. A ce moment, comme a et b se réfèrent au même emplacement, a [0] fait également référence à l'emplacement nouvellement référencé par b [0].
  4. Si b = [4,5,6], un nouvel objet de liste sera créé et b fera référence à cet emplacement. À ce stade, a continue de faire référence à l'emplacement d'origine. Il semble qu'il se comporte ainsi.

Je l'ai écrit pendant longtemps, c'est-à-dire Lorsqu'un nouvel objet lui-même est affecté à la variable __, il fera référence à l'endroit où le nouvel objet a été créé au lieu de la destination de référence précédente. __ Il ne devrait y avoir aucun problème dans la pratique.

Recommended Posts

À propos de la référence Python
Python # À propos de la référence et de la copie
À propos des tranches Python
À propos de la notation d'inclusion de python
À propos du type de référence
À propos de Python tqdm.
À propos du rendement Python
À propos de python, classe
À propos de l'héritage Python
À propos de python, range ()
À propos de Python Decorator
À propos des décorateurs Python
Page de référence Python
[Python] À propos du multi-processus
À propos de Python for loop
[Python] Mémo sur les fonctions
Résumé sur Python3 + OpenCV3
À propos de Python, pour ~ (plage)
[Python] Mémo sur les erreurs
À propos de l'environnement de développement Python
Python: à propos des arguments de fonction
Python, à propos de la gestion des exceptions
À propos de Python Pyramid Traversal
À propos de Python3 ... (objet Ellipsis)
[Python] Chapitre 01-01 À propos de Python (First Python)
[Python] À propos de l'entrée standard
À propos de __all__ en python
[Python] En savoir plus sur pip
Prise en charge de Fabric pour Python 3
Python
À propos des objets et des classes Python
À propos des variables et des objets Python
À propos du module Python venv
fonction de mémorandum python pour débutant
À propos de la fonction enumerate (python)
À propos de divers encodages de Python 3
À propos de Python, len () et randint ()
À propos de Perl, Python, PHP, Ruby
À propos de la date et du fuseau horaire Python
Mémorandum sur la corrélation [Python]
Un mémorandum sur le simulacre de Python
À propos des opérateurs de comparaison de chaînes Python
À propos de Python et des expressions régulières
[Python] Référence Numpy, extraction, combinaison
À propos des fonctionnalités de Python
À propos de "for _ in range ():" de python
À propos des opérations Python et OS
À propos de Python sort () et reverse ()
Une note sur [python] __debug__
Remarque Python: à propos de la comparaison en utilisant is
À propos de l'installation des séries Pwntools et Python2
Python: une note sur les classes 1 "Résumé"
[Python] Écrivons brièvement la notation d'inclusion
À propos de Python dict et des fonctions triées
[Python] Qu'est-ce que @? (À propos des décorateurs)
Ce qui était surprenant dans les classes Python
table de référence rapide du format datetime python