Question de novice Python sur les variables locales et les variables globales
学习ing
学习ing 2017-06-12 09:24:56
0
3
1130

Premier code :

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums = [11,22,33,44,55,999]
    print(nums)

nums_chang() # 打印出来是[11,22,33,44,55,999]
print(nums)  # 打印出来是[11,22,33,44,55]

Résultat de l'exécution :

Deuxième code :

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums.append(999)  # 打印出来是[11,22,33,44,55,999]
    print(nums)       # 打印出来是[11,22,33,44,55,999]

nums_chang()
print(nums)

Résultat de l'exécution :

Ma question est :
Pourquoi les deux résultats imprimés par le premier code sont-ils différents, mais les résultats imprimés par le deuxième code sont les mêmes ? Surtout le deuxième morceau de code, pourquoi la commande append dans la fonction peut-elle modifier les variables globales à l'extérieur. Dans le premier morceau de code, la liste est redéfinie, mais les variables globales externes ne peuvent pas être modifiées ? Quelle est la raison ici ?

学习ing
学习ing

répondre à tous(3)
仅有的幸福

Après avoir lu la réponse acceptée, je pense que j'ai encore raté le point.
Tout d'abord, la variable nums est définie comme une variable globale, ce qui signifie que dans ce fichier ".py", toutes les classes et fonctions peuvent l'utiliser. Mais toutes les variables sont aussi un objet, et les objets sont divisés en mutables et immuables. La liste est un objet mutable, ce qui signifie qu'elle peut être modifiée. Alors, que sont les objets mutables ? Ce sont ceux qui peuvent opérer sur des objets sans affecter leur création et leur mort en mémoire. Entrez x="234", et si vous attribuez une autre valeur, x="111". En fait, les deux x sont déjà deux objets, ils sont juste couverts, c'est-à-dire x = x + "123", et x est aussi un nouvel objet.

S'il s'agit d'une liste, x = [1,2,3], opérez maintenant dessus, x.remove(1), alors l'objet x est toujours un objet x, mais la valeur de l'objet a changé

Le premier morceau de code : il s'agit d'une réaffectation. Dans différentes portées, nums est à nouveau attribué, de sorte que la variable globale nums et la variable nums dans la fonction nums_chang ne sont plus le même objet, elles apparaissent donc lorsque vous. print. différentes valeurs. À l'heure actuelle, la variable nums dans la fonction nums_chang est déjà une variable locale et n'est utilisée que par cette fonction

.

Le deuxième morceau de code : nums est une liste et un objet variable, donc l'opération sur la liste n'affecte pas cet objet, donc cet objet est toujours l'objet global. Les variables globales sont utilisées à la fois dans les fonctions et à l'extérieur, donc après vous. modifiez-le, la valeur de la variable globale est également modifiée

Peter_Zhu

Premièrement : concernant la question de la portée, vous pouvez d'abord vous référer à l'un de mes articles : Python : Scope et LEGB, vous pouvez d'abord comparer 变量的查找有个基本的认识,然后我们能够看到, 因为有赋值语句, 所以numsIl recherchera uniquement à partir de la portée locale et n'interagira pas avec la portée globale

.

Deuxième : sur la base du premier, nous pouvons voir que nums.append(999)中的nums是从全局作用域找到的, 又因为用的是append方法, 这方法是直接用于源列表本身, 所以你看到全局的numsa également été mis à jour

扔个三星炸死你

Si la fonction ne parvient pas à trouver la variable dans sa propre portée, elle reviendra à la portée précédente pour la trouver. C'est ainsi que votre deuxième est née.
Si c’est le premier, c’est évident que vous avez donné de la valeur

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal