Maison  >  Article  >  développement back-end  >  Explication détaillée de cinq points de connaissances pour comprendre facilement la portée de Python

Explication détaillée de cinq points de connaissances pour comprendre facilement la portée de Python

高洛峰
高洛峰original
2017-03-28 15:09:571270parcourir

Il existe de nombreuses introductions à la portée de Python sur Internet, donc l'article que je partage avec vous aujourd'hui vous permet de comprendre facilement la portée de Python en apprenant ces 5 points de connaissances. Les amis dans le besoin peuvent s'y référer.

">

1. Portée au niveau du bloc

Pensez à savoir s'il y aura une sortie lors de l'exécution du programme suivant à ce moment-là ? L'exécution sera-t-elle réussie ?

#Portée au niveau du bloc

if 1 == 1 :
nom = "lzl"

imprimer(nom)


pour i in range( 10):
age = i

print(age)

Jetons d'abord un coup d'œil aux résultats de l'exécution

C:/Users/L /PycharmProjects/s14/preview/ Day8/scope/main.py
lzl
9

Processus terminé avec le code de sortie 0

Le code est exécuté avec succès, pas de problème ; Java/C#, exécutez ce qui précède. Le code indiquera que le nom et l'âge ne sont pas définis, mais il peut être exécuté avec succès en Python. En effet, il n'y a pas de portée au niveau du bloc en Python. Les variables du bloc de code peuvent être appelées. en externe, afin qu'il puisse être exécuté avec succès ;

2. Portée locale

En repensant aux connaissances que nous avons apprises auparavant, lorsque nous avons appris les fonctions, la fonction était une portée distincte. Il n'y a pas de bloc. -level scope en Python, mais il existe une portée locale ; jetez un œil ci-dessous Code

#Local scope

def func():
name = "lzl"

print(name)

Exécutez cette section Code, demandez-vous s'il y aura une sortie

Traceback (dernier appel le plus récent) :
Fichier "C:/Users/L /PycharmProjects/s14/preview/Day8/scope/main.py ", ligne 23, dans
print(name)
NameError : le nom 'nom' n'est pas défini

En cours d'exécution erreur, je pense que tout le monde peut comprendre cela, la variable name est uniquement dans La fonction func() prend effet en interne, elle ne peut donc pas être appelée globalement ; faites un simple ajustement au code ci-dessus et voyez quel est le résultat

#Portée locale

def func ():
name = "lzl"

func() #Exécuter la fonction
print(name)

ajouté un code au code précédent avant d'imprimer le nom de la variable, exécutez la fonction, l'impression changera-t-elle à ce moment-là

Traceback (dernier appel le plus récent) :
Fichier "C:/Users/L/ PycharmProjects/s14/preview/Day8/Function Domain/main.py", ligne 23, dans
print(name)
NameError : name 'name' n'est pas défini

Le l'exécution signale toujours une erreur, alors revenez à la phrase précédente Mots : Même si la fonction est exécutée, la portée du nom est uniquement à l'intérieur de la fonction, et elle ne peut toujours pas être appelée de l'extérieur, rappelez-vous les deux premiers points de connaissance ; puis commencez à agrandir l'astuce

3. Scope Chain

faire des ajustements à la fonction et voir quel est le résultat de l'exécution du code suivant ?

#Scope chain

name = "lzl"
def f1():
name = "Eric"
def f2():
name = " Snor"
print(name)
f2()
f1()

Si vous avez appris les fonctions, vous devez savoir que Snor sera affiché après l'exécution de f1() ; rappelons-le un concept d'abord, il y a une chaîne de portée en Python, les variables seront recherchées de l'intérieur vers l'extérieur, allez d'abord dans votre propre portée pour la trouver, et vous n'irez pas au niveau supérieur pour la trouver jusqu'à ce que vous ne puissiez pas la trouver et signaler une erreur

4. Portée ultime

D'accord, assez de préparation, la version ultime est ici~~

#Portée de la version ultime

nom = "lzl"

def f1( ):
print(name)

def f2():
name = "eric"
f1()

f2()

think Voulez-vous imprimer "lzl" ou "eric" comme résultat final de l'exécution de f2() ? N'oubliez pas votre réponse. Ne publiez pas la réponse maintenant. Jetez un œil au code suivant :

#ULTIMATE SCOPE

name = "lzl"

def f1(). :
print(name)

def f2():
name = "eric"
return f1

ret = f2()
ret()

#Output : Le résultat de l'exécution de lzl

est "lzl". Analysez le code ci-dessus. Le résultat de l'exécution de f2() est l'adresse mémoire de la fonction f1, c'est-à-dire ret=f1. ; exécuter ret() équivaut à exécuter f1(), cela n'a rien à voir avec f2() et f1() sont dans la même chaîne de portée. à l'intérieur de la fonction, elle sera recherchée à l'extérieur, donc ceci La valeur du nom de la variable temporelle est "lzl"; après avoir compris cela, vous connaissez également la réponse au code ultime dont la réponse n'a pas été donnée tout à l'heure

#Portée de la version ultime

name = "lzl"

def f1():
print(name)

def f2():
name = "eric"
f1()

f2 ()

# Sortie : lzl

Oui, le résultat est "lzl", rappelez-vous qu'avant l'exécution de la fonction, la portée a été formée et la chaîne de portée a également été générée

5 Questions d'entretien avec Sina

. li = [lambda :x for x in range(10)]

Déterminer le type de li ? De quel type sont les éléments de li ?

print(type(li))
print(type(li[0]))

#
#

Vous pouvez voir que li est un type de liste et que les éléments de la liste sont des fonctions. Imprimez ensuite la valeur de retour du premier élément de la liste. Quelle est la valeur de retour à ce moment-là ?

Questions d'entretien #lambada

li = [lambda :x pour x dans la plage (10)]

res = li[0]()
print(res )

#Output : 9

liLa valeur de retour de la première fonction est 9, pas 0. N'oubliez pas : le code interne ne sera pas exécuté avant l'exécution de la fonction dans le blog ; pouvez le pratiquer vous-même et approfondir votre impression

Résumé

Ce qui précède est l'intégralité du contenu de cet article. Je ne sais pas si cela peut apporter de l'aide aux études et au travail de chacun si vous. Si vous avez des questions, vous pouvez laisser des messages pour communiquer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn