[Python débutant] Variables et portée à l'intérieur de la fonction (lorsque le traitement à l'intérieur de la fonction est reflété à l'extérieur de la fonction et quand il n'est pas reflété)

J'avais une vague compréhension de la portée des variables dans une fonction en Python, je vais donc la partager pour tous ceux qui sont tombés sur quelque chose de similaire. Ce que je voudrais dire, c'est que pour une variable préparée en tant qu'argument de la fonction __, lorsqu'une affectation complète est faite à cette variable, elle est traitée comme si une nouvelle variable locale était définie, et lorsqu'une affectation est faite à un élément de la variable. Veuillez noter qu'il y a une différence qu'elle est traitée comme une variable globale car elle est __.

Dans le code ci-dessous, nous manipulons deux listes list_a et list_b à l'intérieur de la fonction, mais seule list_b est traitée comme une variable globale et a un effet en dehors de la fonction.

def func(list_a, list_b):
    list_a = list_a + ['hoge']
    list_b[1] = list_b[1] + 10


a = [1, 2, 3]
b = [5, 6, 7]

func(a, b)
print(f"a={a}, b={b}")
func(a, b)
print(f"a={a}, b={b}")

La sortie sera:

a=[1, 2, 3], b=[5, 16, 7]
a=[1, 2, 3], b=[5, 26, 7]

En Python, les expressions de la forme "a = ..." dans une fonction sont traitées comme une variable locale nouvellement définie a qui n'a une portée que dans la fonction __. Par conséquent, dans list_a = list_a + ['hoge'] de la fonction func, list_a sur le côté gauche est traité comme une nouvelle définition de la variable locale list_a (list_a sur le côté droit est donné comme argument de la fonction et est en dehors de la fonction. Est également une variable de portée). Par conséquent, cela n'a aucun effet sur l'extérieur de la fonction.

Par contre, pour list_b [1] = list_b [1] + 10, list_b [1] des deux côtés doit être traité comme le premier élément de __ déjà défini __variable list_b. Dans cet exemple, list_b est un argument de la fonction func, une variable déjà définie en dehors de la fonction. Par conséquent, le traitement par func se reflète dans la variable b en dehors de la fonction.

Il en va de même pour les variables d'autres types tels que ndarray et pandas.DataFrame.

Recommended Posts

[Python débutant] Variables et portée à l'intérieur de la fonction (lorsque le traitement à l'intérieur de la fonction est reflété à l'extérieur de la fonction et quand il n'est pas reflété)
Test.py n'est pas reflété sur le serveur Web dans Python3.
NameError: le nom global'dot_parser 'n'est pas défini et que faire quand il apparaît en python
Construire un environnement Python sur Ubuntu (lorsque pip n'était pas la valeur par défaut)
[Python] Doux Est-ce doux? À propos des suites et des expressions dans les documents officiels
Traitement lorsque l'entrée clé de pygame Python ne se passe pas bien.
python Remarque: lorsque easy_install ne peut pas être utilisé
[Python] Utiliser et et ou lors de la création de variables
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
Il semble que la version de pyflakes ne soit pas la dernière lorsque flake8 est installé
[Python] Précautions lors de l'acquisition de données en grattant et en les mettant dans la liste
Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation
[EC2] Que faire lorsque le sélénium est bloqué et que le traitement ne se poursuit pas
Utilisez python sur Raspberry Pi 3 pour éclairer la LED quand il fait noir!
Python Pandas ne convient pas au traitement par lots
La réponse de "1/2" est différente entre python2 et 3
À propos de la différence entre "==" et "is" en python
[Python Data Frame] Lorsque la valeur est vide, remplissez-la avec la valeur d'une autre colonne.
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Il y a un modèle que le programme ne s'est pas arrêté lors de l'utilisation du thread Python
[Python] Précautions quand cela ne fonctionne pas même si TimedRotatingFileHandler est défini dans basicConfig en python2
Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel