94 votes

Les variables Python sont-elles des pointeurs ? Ou encore, que sont-elles ?

Les variables en Python sont juste des pointeurs, pour autant que je sache.

Sur la base de cette règle, je peux supposer que le résultat pour cet extrait de code :

i = 5
j = i
j = 3
print(i)

serait 3 .

Mais j'ai obtenu un résultat inattendu pour moi, et c'était 5 .

D'ailleurs, mon livre Python traite de cet exemple :

i = [1,2,3]
j = i
i[0] = 5
print(j)

Le résultat serait [5,2,3] .

Qu'est-ce que je comprends mal ?

2voto

Mark Reed Points 23817

L'assignation ne modifie pas les objets ; elle ne fait que changer l'endroit où la variable pointe. Changer le pointage d'une variable ne changera pas le pointage d'une autre variable.

Vous pensez probablement au fait que les listes et les dictionnaires sont des types mutables. Il existe des opérateurs permettant de modifier les objets réels sur place, et si vous utilisez l'un d'entre eux, vous verrez le changement dans toutes les variables pointant vers le même objet :

x = []
y = x
x.append(1)
# x and y both are now [1]

Mais l'affectation ne fait que déplacer le pointeur :

x = [2]
# x now points to new list [2]; y still points to old list [1]

Les nombres, contrairement aux dictionnaires et aux listes, sont immuables. Si vous faites x = 3; x += 2 vous ne transformez pas le nombre 3 en nombre 5 ; vous faites simplement de la variable x point à 5 à la place. Le 3 est toujours là, inchangé, et toutes les variables qui pointent vers lui verront toujours 3 comme leur valeur.

(Dans l'implémentation réelle, les nombres ne sont probablement pas du tout des types de référence ; il est plus probable que les variables contiennent en fait une représentation de la valeur directement plutôt que de pointer vers elle. Mais ce détail d'implémentation ne change pas la sémantique où les types immuables sont concernés).

1voto

mbatchkarov Points 5090

Lorsque vous définissez j=3 l'étiquette j ne s'applique plus (points) à i il commence à pointer vers l'entier 3 . Le nom i fait toujours référence à la valeur que vous avez définie à l'origine, 5 .

1voto

La variable qui se trouve à gauche du signe '=' se voit attribuer la valeur qui se trouve à droite du signe '='.

i = 5

j = i --- J a 5

j = 3 --- j a 3 (écrase la valeur de 5) mais rien n'a été changé concernant i

print(i) -- donc ça imprime 5

0voto

zgulser Points 925

En Python, tout est objet, y compris les morceaux de mémoire eux-mêmes que l'on vous renvoie. Cela signifie que lorsqu'un nouveau morceau de mémoire est créé (indépendamment de ce que vous avez créé : int, str, objet personnalisé, etc. Dans votre cas, c'est l'affectation à 3 qui crée un nouvel objet (de mémoire) et a donc une nouvelle adresse.

Si vous exécutez ce qui suit, vous verrez facilement ce que je veux dire.

i = 5
j = i
print("id of j: {}", id(j))
j = 3
print("id of j: {}", id(j))

À mon avis, en ce qui concerne la mémoire, c'est la principale différence entre C et Python. En C/C++, on vous renvoie un pointeur mémoire (si vous utilisez la syntaxe du pointeur, bien sûr) au lieu d'un objet mémoire, ce qui vous donne plus de flexibilité en termes de changement d'adresse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X