@dividee
oui je suis entièrement d'accord avec ça, l'opération d'affectation crée un nouvel objet en mémoire (sauf dans le cas des singleton) mon exemple était mal choisi, j'aurais dû mettre a += 1.
@eyquem:
Je pense que dividee faisait allusion à mon message:Et j’attends de voir un code avec définition de __iadd__ qui va donner la même adresse.
créera automatiquement un nouvel objet en mémoire, et ce quelque soit le type de a (muable ou non muable).
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = a + 1
en revanche:
ne crée un nouvel objet en mémoire que si a est non muable (un entier par exemple). C'est donc précisemment cet exemple que j'aurais dû fournir (pour mettre en relation la modification 'in-place' d'un type muable et d'un type non-muable).
Code : Sélectionner tout - Visualiser dans une fenêtre à part a += 1
En effet, pour un muable (une liste) c'est la même zone mémoire qui continue d'être utilisée:
Donc dividee a raison dans le sens ou la distinction entre type muable et non muable n'opére que lors d'une opération sur un objet mais pas à l'affectation (opérateur =). Dans ce dernier cas, seul le cas du singleton sera différent. Et ceci se mêle à ce que fait Python pour limiter la création d'objet en mémoire, ainsi, sur ma version de Python (2.6.4 64bits sur Ubuntu 9.04 64bits):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 >>> a = [] >>> id(a) 140076096098176 >>> a += [1] >>> a [1] >>> id(a) 140076096098176 >>> a = a + [2] >>> id(a) 140076096259496
Oala, je pense qu'à la nomenclature près on est d'accords sur la mécanique sous-jacente . Comme eyquem, je ne suis pas fan de la dénomination 'variable' je trouve qu'elle a tendance à apporter confusion pour des gens venant d'autres langages, c'est pour cela que j'ai appelé ça "nom" ou "étiquette" mais si "étiquette" est peut être plus parlant, il ne trouve pas d'échos dans les documentations officielles, "nom" en revanche pourrait coller.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 >>> c = 1 >>> d = 1 >>> c is d True #c'est Python qui décide !, l'affectation d = 1 ne crée pas un nouvel objet en mémoire. #mais cela peut être différent avec d'autres versions (ou implémentation ?) de Python. >>> a = None >>> b = None >>> a is b True #ça se sera toujours le cas puisque None est un singleton (il n'existe qu'un seul et #unique objet de ce type au cours de l'exécution du programme). Les singleton ne se #limitent pas à None, on peut créer les nôtres :). >>> e = [] >>> f = [] >>> e is f False #ça sera toujours le cas aussi car les listes sont muables :)
Partager