Python utilise la méthode pass-by-value, mais comme toutes ces valeurs sont des références d'objets, l'effet net s'apparente à la méthode pass-by-reference. Cependant, les programmeurs Python pensent davantage à savoir si un type d'objet est mutable o immuable . Les objets mutables peuvent être modifiés sur place (par exemple, les dictionnaires, les listes, les objets définis par l'utilisateur), alors que les objets immuables ne le peuvent pas (par exemple, les entiers, les chaînes de caractères, les tuples).
L'exemple suivant montre une fonction à laquelle on passe deux arguments, une chaîne immuable et une liste mutable.
>>> def do_something(a, b):
... a = "Red"
... b.append("Blue")
...
>>> a = "Yellow"
>>> b = ["Black", "Burgundy"]
>>> do_something(a, b)
>>> print a, b
Yellow ['Black', 'Burgundy', 'Blue']
La ligne a = "Red"
crée simplement un nom local, a
pour la valeur de la chaîne "Red"
et n'a pas d'effet sur l'argument passé (qui est maintenant caché, car a
doit se référer au nom local à partir de ce moment-là). L'assignation n'est pas une opération in-place, que l'argument soit mutable ou immuable.
Le site b
est une référence à un objet liste mutable, et le paramètre .append()
effectue une extension in situ de la liste, en ajoutant le nouvel élément "Blue"
valeur de la chaîne.
(Les objets de type chaîne étant immuables, ils ne disposent d'aucune méthode prenant en charge les modifications in situ).
Une fois que la fonction revient, la réaffectation de la fonction a
n'a eu aucun effet, tandis que l'extension de b
montre clairement la sémantique d'appel du style pass-by-reference.
Comme mentionné précédemment, même si l'argument pour a
est un type mutable, la réaffectation au sein de la fonction n'est pas une opération in-place, et il n'y aura donc aucun changement de la valeur de l'argument passé :
>>> a = ["Purple", "Violet"]
>>> do_something(a, b)
>>> print a, b
['Purple', 'Violet'] ['Black', 'Burgundy', 'Blue', 'Blue']
Si vous ne vouliez pas que votre liste soit modifiée par la fonction appelée, vous utiliseriez plutôt le type tuple immuable (identifié par les parenthèses dans la forme littérale, plutôt que par les crochets), qui ne prend pas en charge la fonction in-place .append()
méthode :
>>> a = "Yellow"
>>> b = ("Black", "Burgundy")
>>> do_something(a, b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in do_something
AttributeError: 'tuple' object has no attribute 'append'
0 votes
Il y a déjà une réponse ici qui explique la situation en PHP5.
4 votes
Wow - cette question a un lien vers le serveur bêta. Je pense que vous devriez corriger le lien en bêta.