Comment puis-fonctions imbriquées travail en Python?

def maker(n):
    def action(x):
        return x ** n
    return action

f = maker(2)
print(f)
print(f(3))
print(f(4))

g = maker(3)
print(g(3))

print(f(3)) # still remembers 2

Pourquoi la fonction imbriquée souviens de la première valeur 2 même si maker() est retourné et est ressortie par le temps action() est appelé?

  • Vous toujours de répondre à chacun (au moins la mienne) question avec ce ton. VOUS avez 66k rep, et vous semblez être un grand programmeur, ce qui est bon pour vous:), mais je viens juste de commencer et je me demander ce que je ne comprends pas, et besoin de plus d'explication, c'est ce qui est DONC pour je crois.
  • C'est vraiment pas évident pourquoi/comment cela devrait fonctionner. C'est juste qu'un nouveau programmeur doit être confondu lorsqu'une fonction a retourné son champ d'application existe toujours. Surtout s'ils viennent d'un langage comme C++ où tout dans le champ d'application est détruite lorsqu'une fonction retourne une valeur.
  • C'est un peu similaire à une question posée à seulement 6 heures: stackoverflow.com/questions/2004398/nested-scopes-and-lambdas
  • "Pourquoi" questions n'ont pas vraiment de réponses utiles. Le problème est qu'il est défini de cette façon; il n'y a rien de plus utile à dire. Vous pouvez ainsi comme "pourquoi la vitesse de la lumière constante?" ou "pourquoi la gravité est une attraction mutuelle?" Il est. Vous pourriez vous demander à propos des conséquences. Ou vous pourriez vous demander pourquoi une problème de programmation ne fonctionne pas. Demander "pourquoi" de la valeur de la fonction de liaison se produit à définir le temps n'est pas utile. Il est défini de cette façon.
  • Mon point est de savoir ce réel problème que vous rencontrez. Remarquez que j'ai refuser downvoting jusqu'à ce que après ce que je demande. À moins que la question est en fait mauvais. Des questions inutiles peut être améliorée en modifiant le foyer de la "pourquoi" au "comment puis-je faire usage de cela?" ou "comment puis-je résoudre ce problème, je vais avoir?" De mauvaises questions ne peut pas être amélioré.
  • DONC, ce n'est pas seulement à propos de la résolution de problèmes, c'est à propos de l'acquisition de la connaissance. Si Nimbuz découvre la raison pour laquelle Python œuvres de ce genre, il a acquis une meilleure compréhension. Il va également de savoir ce qui le rend différent des autres langues, et pourquoi. Comme les autres lire la question et la réponse. Je pense que cette question est loin d'être inutile.
  • Le "pourquoi" est trivial, cependant. C'est juste définis de cette façon. Les connaissances déjà acquises avant de poser la question. @Nimbuz observé, appris tout ce qu'il ya à savoir sur le sujet. Ce qui peut être appris de demander pourquoi? L'exemple montre -- remarquablement claire, la leçon qui a déjà été appris.
  • Assurément, il est évident que l'affiche originale voulez savoir pourquoi il est utile de comportement? Généralement, quand un langage de programmation n'quelque chose qui semble déroutant pour un débutant, c'est pour faciliter quelque chose de puissant pour un expert, et il veut sans doute de savoir précisément ce que c'est, pour approfondir sa compréhension. Je ne serais pas d'accord que Nimbuz "appris tout ce qu'il ya à savoir sur le sujet" - il semble savez pas où ceux liés valeurs sont à venir à partir, ce qui est compréhensible étant donné que les arguments de la fonction, dans 99% des cas ne sont que de passage.
  • ^ exactement! Je comprends que certains experts ici obtenir ennuyé par la même des questions de newbie, mais personne n'aime perdre son (ou leur) temps vraiment. Pourquoi aurais-je poser une question, si je connaissais déjà la réponse? J'ai vu le résultat, mais je voulais savoir le fonctionnement derrière elle afin que je puisse mieux comprendre le concept. Bien sûr, si cela semble trop stupide pour vous, ce qui est tout à fait possible, il suffit de déplacer sur, pourquoi critiquer et de décourager les débutants à partir de poser des questions qui peuvent aider les autres aussi ? 🙂
  • Le fonctionnement "derrière" est complètement différent de "pourquoi" est défini de cette façon. "Pourquoi" est à peine même académique. C'est à peine même histoire intéressante. La manière dont il fonctionne, la façon dont vous l'utilisez, est intéressant. Se poser la question.
  • Ok, j'ai donc posé la question de façon incorrecte? Tout à fait possible, mais alors, je vais devoir apprendre l'anglais d'abord parce que ce n'est pas ma langue maternelle. Espérons que vous vous rendez compte que c'est une communauté internationale et NOUS n'est pas le seul pays dans le monde, et l'anglais n'est pas la seule langue. 🙂 Mais je me demande comment les autres compris ma question correctement bien, sauf vous.
  • Peut-être parce que l'anglais n'est pas ma première langue. "Pourquoi" des questions sont toujours stupide dans la totalement artificiel monde des ordinateurs. Essayez de poser des questions qui ont une action comme le résultat: des questions où la réponse est quelque chose que vous allez faire. "Pourquoi?" ne mènent pas à vous faire quoi que ce soit. Ils n'ont même pas conduire à vous de savoir quoi que ce soit-que vous saviez déjà, et on a déjà dit clairement ce qu'elle savait. Ayez confiance en vous-même. Vous saviez tout ce qu'il y avait à savoir à propos de cette ridicule situation dans les paramètres de la fonction de liaison.
  • Le plus voté réponses ne réponds pas "pourquoi". Les réponses fournissent un complément d'information dans ce que vous avez découvert. Ils ne fournissent pas un mot d'explication quant à la pourquoi python n'a cette.
  • Vrai. J'ai juste essayé de répondre en fournissant des informations de fond à la "Question". Je ne peux pas répondre pourquoi la fonction imbriquée se souvient de la valeur. J'aurais dû puiser dans les pythons code source .. Mais même si quelqu'un avait montré les lignes correspondantes dans le python de la mise en œuvre, j'ai tendance à penser qu'il n'aurait pas été plus instructif dans ce cas. (Ces commentaires m'ont rappelé, ce qu'est un marsian mathematican a dit une fois: En mathématiques, on ne comprends pas les choses. Vous venez de faire.)
  • Ok, j'abandonne à vous convaincre. Je vais revenir à l'apprentissage de Python. ;P
  • demander pour plus d'explication est la bonne. Faire plus de cela. Demander "pourquoi" est une très, très difficile pour la plupart d'entre nous de répondre. Faire moins de cela. Vous n'avez pas à "convaincre" de rien. Je comprends que vous voulez plus d'explications -- que j'ai 66K réputation. Je suggère que vous l'obtiendrez plus de réponses utiles lorsque vous posez des questions plus précises.
  • double possible de Fonction Imbriquée dans Python
  • S. Lott est essentiellement de s'opposer à la sémantique de l'utilisation du mot "pourquoi", alors que, souvent, une époque où "pourquoi" est posée à l'intérieur d'une portée limitée (par exemple, cette question de programmation), c'est juste une autre façon de demander "comment ce code étapes à travers. Fondamentalement, S. Lott a vraiment une définition étroite de "pourquoi", quand le "pourquoi" est parfaitement correct à utiliser, car il peut aussi signifier "comment cela fonctionne"? Pas sûr de savoir comment vous pouvez être qui ignore que d'autres nuances du mot "pourquoi" dans la vie réelle d'utilisation.

InformationsquelleAutor 3zzy | 2010-01-05