Question

ai envoyé une référence à un objet bool, et je l'ai modifiée dans un procédé. Après avoir terminé le procédé il est l'exécution, la valeur de la bool en dehors de la méthode était inchangée.

Cela me porte à croire que les bools de Python sont passés par valeur. Est-ce vrai? Quels sont les autres types de Python se comportent de cette façon?

Était-ce utile?

La solution

variables Python ne sont pas "références" dans le sens C ++. Au contraire, ils sont tout simplement des noms locaux liés à un objet à un emplacement arbitraire dans la mémoire. Si cet objet lui-même est mutable, les modifications qu'il seront visibles dans d'autres champs d'application qui ont un nom lié à l'objet. De nombreux types primitifs (y compris bool, int, str et tuple) sont immuable cependant. Vous ne pouvez pas modifier leur valeur en place; plutôt, vous attribuez une nouvelle valeur au même nom dans votre champ local.

En fait, presque tous les temps * vous voyez le code de la forme foo = X, cela signifie que le nom foo est attribué une nouvelle valeur (X) dans votre espace de noms local actuel, pas un emplacement en mémoire nommé par foo est d'avoir son pointeur interne mis à jour au lieu de se référer à l'emplacement de X.

* -. La seule exception à cela en Python est setter pour les propriétés qui peuvent vous permettre d'écrire obj.foo = X et l'ont réécrite en arrière-plan pour appeler à la place une méthode comme obj.setFoo(X)

Autres conseils

Cela dépend si l'objet est mutable ou immuable. Les objets non modifiables se comportent comme vous l'avez vu avec le bool, alors que les objets mutables changeront.

Pour référence: http://www.testingreflections.com/node/view/5126

  

Python passe des références à des objets par valeur (comme Java), et tout en Python est un objet. Cela semble simple, mais vous remarquerez que certains types de données semblent présenter des caractéristiques de passage par valeur, tandis que d'autres semblent agir comme passage par référence ... Quel est le problème?

     

Il est important de comprendre les objets mutables et immuables. Certains objets, comme des cordes, des tuples et des chiffres, sont immuables. les modifier dans une fonction / méthode va créer une nouvelle instance et l'instance d'origine en dehors de la fonction / méthode ne change pas. D'autres objets, comme les listes et les dictionnaires sont mutable, ce qui signifie que vous pouvez changer l'objet en place. Par conséquent, la modification d'un objet à l'intérieur d'une fonction / méthode va aussi changer l'objet original à l'extérieur.

La chose à retenir est qu'il ya aucun moyen en Python pour une fonction ou une méthode pour lier de nouveau un nom dans l'espace de noms d'appel. Lorsque vous écrivez «J'ai envoyé une référence à un objet bool, et je l'ai modifié dans une méthode », ce que vous avez réellement fait (je suppose) était de lier de nouveau le nom du paramètre (auquel la valeur bool était liée par l'appel) à l'intérieur le corps de la méthode.

En bref, il n'y a pas de variables en Python ; il y a des objets (comme True et False, les bools se trouvent être immuable), et les noms. Les noms sont ce que vous appelez des variables, mais les noms appartiennent à une portée, vous ne pouvez pas normalement modifier les noms autres que les noms locaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top