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).