De retour Variables dans les Fonctions Python Pas le Droit de Travailler
J'ai essayé de renvoyer une variable dans une fonction dans une variable et l'utilisation à l'extérieur:
test = 0
def testing():
test = 1
return test
testing()
print(test)
Mais quand je le lance, le résultat est 0. Comment pourrais-je résoudre ce problème?
- Changer le nom de la variable globale
test
àg_test
et vous allez comprendre. Ils sont deux totalement différents variables, et en utilisant le même nom, vous êtes juste confus de vous-même. - Il y a 7 voix de cette écriture sur une réponse qui ressemble à droite. Mais je ne pense pas que quelqu'un fait l'a expliqué. Le vrai problème dans votre code (la seule raison qu'il ne fonctionne pas), c'est que lorsque vous faites l'appel de la fonction, vous n'avez pas de capture de la valeur de retour. Puis vous imprimez un original inchangé variable globale. Commentaires sur le champ d'application sont corrects. "test" à l'intérieur de votre fonction est locale et est une copie qui ne change pas le "test" de la variable qui est en dehors de la fonction.
- Si vous êtes nouveau à Python, vous devriez google "mutation du rapport à nonmutating" et de lire des messages sur un Débordement de Pile en parler lorsque vous travaillez avec des listes et d'obtenir un comportement différent de apparemment le même code. Si vous passez "test" comme un argument, vous devez le retourner et de le capturer pour qu'il fonctionne. Mais ce comportement est différent pour la mutation de variables comme des listes. Espérons que vous trouverez ce utile en plus des corrections de code déjà fournis par des tiers à votre question.
- oups - c'est un enfant de 3 ans post. Suppose que j'ai juste écrit que pour l'exhaustivité pour quelqu'un qui trébuche sur ce fil, tout en cherchant à résoudre un problème.
Vous devez vous connecter pour publier un commentaire.
Vous gâcher un peu la portée et/ou de la cession. Essayez ceci:
Explication: Le
test
à l'intérieur detesting
est différente de latest
à l'intérieur du module. Vous devez l'affecter à niveau du module pour obtenir le résultat escompté.Parce que vous déclarez
test
dans la fonction, il n'est pas une variable globale, par conséquent, vous ne pouvez pas accéder à la variabletest
vous avez créé dans la fonction en dehors de ce qu'ils sont différents des étenduesSi vous voulez
return test
à une variable, vous avez à faireOu, vous pouvez également ajouter un
global
déclaration:Par la façon dont, dans le cas d'une instruction conditionnelle, vous n'avez pas besoin de les crochets autour de la
1==1
:).L'intérieur de la fonction
testing()
, vous êtes en train de créer une nouvelle variabletest
, pas en se référant à celui qui existe déjà. Si vous voulez le faire, vous devez utiliser unglobal
déclaration dans le haut, comme dans:Votre
test
variable à l'intérieur de la fonction n'a pas de portée mondiale. Donc, si vous voulez stocker la valeur de retour dans une variable de sortie et par la suite, vous pouvez faire quelque chose comme ceci:TLDR: UN
return
valeur doit être attribué à quelque chose sur le site d'appel.Fonctions en Python ont leur propre champ d'application. Il est créé sur l'entrée (l'appel de la fonction, et détruit lors de la laisser. L'affectation à une nom à l'intérieur d'un cadre qui nom local de ce champ d'application - à l'origine pour être détruits avec le champ d'application.
Notamment, les noms de l'un à l'intérieur de la portée peut "l'ombre" des noms à partir de l'extérieur de la portée. Alors que le nom de
test
existe dans les deuxtesting
et l'extérieur de la portée, il ne fait pas référence à la même chose. Cela a deux conséquences importantes:test
n'affecte pas la extérieurtest
.testing
, le intérieuretest
est détruit et seul le extérieurtest
reste.C'est pourquoi l'appel de
testing()
n'a pas eu l'effet escompté: il ne modifie jamais l'extérieurtest
passé àprint
.Le
return
déclaration définit la valeur retournée par l'appel d'une fonction. Il ne pas de retourner le nom, seule la valeur pointée.La valeur retournée par une fonction, c'est comme n'importe quelle autre valeur - être à partir d'un littéral, de recherche, ou d'autres. Plus important encore, la valeur ne persiste pas moins que, vous pouvez l'affecter à un nom ou à utiliser directement.
Afin de retourner quelque chose à partir d'une fonction pour une utilisation ultérieure, vous devez stocker le résultat d'un nom. Vous pouvez ensuite utiliser ce nom dans une autre instruction. Un exemple minimal pour votre cas ressemble à ceci:
Addendum: Il est possible pour une fonction à modifier son contenant portée. Cependant, les noms doivent alors être explicitement déclarées comme provenant de l'étranger portée.
La
non
etglobal
mots-clés permettent de modifier les noms d'étendues extérieures. Unnonlocal
est le nom le plus proche de la fonction de correspondance de portée. Unglobal
est le nom à la portée de module, indépendamment de toutes les fonctions dans l'entre-deux.Noter que la modification externe noms est souvent le signe d'un anti-modèle, moreso pour
global
s quenonlocal
s. Au-delà de petits scripts, il devient difficile de tracer ce qui est de l'accès et la modificationglobal
s. Souvent, il est plus approprié d'utiliser des classes ou des générateurs de tenir l'état.Une fonction peut toujours lire noms à partir de son contenant portée, à condition qu'il jamais écrit à la même nom. Ces fermetures sont très faciles à créer, et l'absence de modification rend plus facile à retracer. Notez que la modification d'un nom de n'importe où dans une fonction locale, sauf déclaration
global
ounonlocal
: