Je travaille sur un programme Python et l'auteur a écrit une fonction qui ressemble à ce Ceci semble fonctionner, même si STR est une fonction intégrée et ne devrait pas être utilisé comme variable. P> Qu'est-ce qui se passe réellement ici? Je suppose que STR ne sera plus utilisable comme une fonction, mais seulement dans la fonction de la fonction bla () qu'il est écrit. Est-ce exact? Cela ne redéfinisse pas STR globalement, non? P> P>
3 Réponses :
Dans votre cas, EDIT: P> Voici une simple démonstration: p> STR code> est juste une variable et rien ne vous empêche d'utiliser habituel de str () code> à l'extérieur de cette fonction:
"Rien ne vous empêche d'utiliser l'utilisation habituelle de Str () fonction" i> - ce n'est pas complet vrai. Comme Juanpa.arrivillaga a déjà mentionné str code> est redéfini localement. Vous ne pouvez donc pas utiliser str () code> dans la portée actuelle, mais que vous pourriez dans la portée globale.
interne, la table variable locale de la fonction contiendra une entrée pour Il y a un autre cas de cavité / coin ici, qui est décrit dans Cette question . L'entrée de la table locale est créée à la compilée, pas au moment de l'exécution, vous ne pouvez donc pas utiliser la définition globale de échouera avec un STR code>, qui sera locale à cette fonction. Vous pouvez toujours accéder à la classe intégrée dans la fonction en effectuant intégré.str code> dans py3 et __ intégré __. STR code> dans PY2. Tout code en dehors de la fonction ne verra aucune des variables locales de la fonction, la classe intégrée sera donc prudente à utiliser ailleurs. STR code> dans la fonction avant même d'affecter "asdf asdf asdf" code > Pour elle: p> Unboundlocaleurror code>. p> p> p>
@Bradsolomon. Merci pour la prise
Construits.str. Nom 'Construits' n'est pas défini code>, apparemment, vous devez l'appeler à l'aide de __ cométine __. STR code>. J'utilise Python 3.7.5.
Cela semble fonctionner, même si STR est une fonction intégrée et ne doit pas être utilisée comme une variable. P>
Oui, c'est vrai. Python ne vous empêche pas de vous tirer dessus dans le pied. C'est à vous de décider que le développeur de veiller à ne pas écraser les noms intégrés. P>
Qu'est-ce qui se passe réellement ici? Je suppose que STR ne sera plus utilisable en tant que fonction, mais seulement dans la portée de la fonction
bla () code> il est écrit. Est-ce exact? Cela ne redéfinira passtr code> globalement, non? P> blockQuote>Vous êtes partiellement correct ici aussi. Si la valeur de
str code> est écrasée locale, alors seule la portée actuelle est affectée. La valeur globale destr code> reste inchangée. Cependant, sistr code> est écrit dans la portée Global em>, alors il affecte tous les sous-échéances. La raison derrière ceci est la manière dont l'interpréteur de Python compile des valeurs au moment de l'exécution. Ce comportement peut être observé à l'aide d'un exemple simple: p>>>> str = 0 >>> str 0 >>> del str >>> str <class 'str'> >>>
Oui,
str code> est seulement redéfini localement. Ce n'est probablement pas un problème énorme et je vois des exemples comme celui-ci avec des noms tels quemax code> etstr code> fréquemment. Si votre fonction n'a que quelques lignes de code, je ne perdrais pas de sommeil sur ceci.Connexes: Stackoverflow.com/q/41029289/2988730 (définitivement pas une dupe)