Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi c e
code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi c e
code :
x=123
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi c e
code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est ob jet"
en Python.
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x=123
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est ob jet"
en Python.
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code :
x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est ob jet"
en Python.
On 8 avr, 13:07, Pierre Maurette wrote:Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code
: x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
id(obj) renvoie l'identifiant unique d'un objet - pour une définition
qui dépend de l'implémentation (en CPython, c'est l'adresse mémoire,
tout simplement).
id(obj1) == id(obj2) <=> obj1 is obj2
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est objet"
en Python.
Ah bon ? Trouve moi une seule chose qui puisse être à droite d'une
assignation et qui ne soit pas un objet...
On 8 avr, 13:07, Pierre Maurette <maurettepie...@wanadoo.fr> wrote:
Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code
: x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
id(obj) renvoie l'identifiant unique d'un objet - pour une définition
qui dépend de l'implémentation (en CPython, c'est l'adresse mémoire,
tout simplement).
id(obj1) == id(obj2) <=> obj1 is obj2
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est objet"
en Python.
Ah bon ? Trouve moi une seule chose qui puisse être à droite d'une
assignation et qui ne soit pas un objet...
On 8 avr, 13:07, Pierre Maurette wrote:Bonjour !
Je ne dois pas être bien réveillé, car je ne comprend pas pourquoi ce code
: x3
y=copy.deepcopy(x)
z=copy.copy(x)
print "x",id(x)
print "y",id(y)
print "z",id(z)
me donne toujours le même identifiant, pour les objets x, y et z ?
Et, comment cloner un objet ? (une fonction, par exemple). Dois-je
systématiquement passer par new ?
Je colle mon wagonnet au train - en tout bien tout honneur - de vos
questions. Je pense d'ailleurs que vous trouverez la réponse avant moi.
Je ne suis pas trop étonné du résultat de vos tests. Mais j'arrive, à
mon niveau, à un défaut de cohérence, effectivement.
J'ai regardé le manuel, doc du module copy, et ce lien:
<URL:http://www.ibm.com/developerworks/opensource/library/os-python1/>
- On lit que la différence entre copy.copy et copy.deepcopy n'a de sens
que pour des types composés.
- Bien que n'ayant pas trouvé la définition définitive de id(),
id(obj) renvoie l'identifiant unique d'un objet - pour une définition
qui dépend de l'implémentation (en CPython, c'est l'adresse mémoire,
tout simplement).
id(obj1) == id(obj2) <=> obj1 is obj2
je
crois comprendre que les types simples de même valeur renvoient toujour
la même id().
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
- Je ne vois pas trop comment __new__ peut changer les choses.
- Je ne suis pas très convaincu par la générélisation "tout est objet"
en Python.
Ah bon ? Trouve moi une seule chose qui puisse être à droite d'une
assignation et qui ne soit pas un objet...
Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
Re !Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
ça m'apprendra à trop vouloir simplifier, avant d'envoyer sur le
newsgroup...
En fait, j'avais le problème avec le code suivant :
import copy
def deco(f):
print "Fonction ",f.__name__
return f
@deco
def prof(a,b,c):
this=prof
this.a=a
this.b=b
this.c=c
return a+b+c
print prof(1,2,3),id(prof)
b=copy.deepcopy(prof)
print b(111,222,333),id(b)
Ce qui m'angoisse, c'est que id(prof)=id(b) ; et donc, que deepcopy ne
clone pas...
J'ai aussi quelques déboires avec les decorators, qui sont exécutés à la
compilation,
Re !
Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
ça m'apprendra à trop vouloir simplifier, avant d'envoyer sur le
newsgroup...
En fait, j'avais le problème avec le code suivant :
import copy
def deco(f):
print "Fonction ",f.__name__
return f
@deco
def prof(a,b,c):
this=prof
this.a=a
this.b=b
this.c=c
return a+b+c
print prof(1,2,3),id(prof)
b=copy.deepcopy(prof)
print b(111,222,333),id(b)
Ce qui m'angoisse, c'est que id(prof)=id(b) ; et donc, que deepcopy ne
clone pas...
J'ai aussi quelques déboires avec les decorators, qui sont exécutés à la
compilation,
Re !Normalement, copy.deepcopy devrait faire l'affaire. Peut-être devrait
tu tester sur un objet mutable ?-)
ça m'apprendra à trop vouloir simplifier, avant d'envoyer sur le
newsgroup...
En fait, j'avais le problème avec le code suivant :
import copy
def deco(f):
print "Fonction ",f.__name__
return f
@deco
def prof(a,b,c):
this=prof
this.a=a
this.b=b
this.c=c
return a+b+c
print prof(1,2,3),id(prof)
b=copy.deepcopy(prof)
print b(111,222,333),id(b)
Ce qui m'angoisse, c'est que id(prof)=id(b) ; et donc, que deepcopy ne
clone pas...
J'ai aussi quelques déboires avec les decorators, qui sont exécutés à la
compilation,
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
a = [1, 2, 3]
b = a
print b
[1, 2, 3]
a[0] = 4
print b
[4, 2, 3] # b change aussi!
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet physique
dans la mémoire (si j'ai bien compris). Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
print "0x%08x" % id(a)
0x00a659e0
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
a = [1, 2, 3]
b = a
print b
[1, 2, 3]
a[0] = 4
print b
[4, 2, 3] # b change aussi!
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet physique
dans la mémoire (si j'ai bien compris). Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
print "0x%08x" % id(a)
0x00a659e0
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
a = [1, 2, 3]
b = a
print b
[1, 2, 3]
a[0] = 4
print b
[4, 2, 3] # b change aussi!
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à MC
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet physique
dans la mémoire (si j'ai bien compris). Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
print "0x%08x" % id(a)
0x00a659e0
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ?
C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à M C
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable.
Un même id() pour deux
variable signifie que le contenu des variable
est le même objet
physique
dans la mémoire (si j'ai bien compris).
Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"
). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ?
C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à M C
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable.
Un même id() pour deux
variable signifie que le contenu des variable
est le même objet
physique
dans la mémoire (si j'ai bien compris).
Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"
). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
Il n'y a pas de "types simples" en Python - tout est objet. Par
contre, certains types - notamment les entier, les floats et les
chaines - sont immutables.
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on ne
peut pas modifier ?
C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
Une implémentation peut donc sans risque
utiliser un cache pour des instances de ces types, cf ma réponse à M C
pour ce qu'il en est avec CPython.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable.
Un même id() pour deux
variable signifie que le contenu des variable
est le même objet
physique
dans la mémoire (si j'ai bien compris).
Chez moi, id() ne donne pas une
adresse mémoire (il me semble en tout cas car j'ai un truc du genre
"3079857356L"
). Existe-t-il une instruction pour avoir l'adresse mémoire
d'une variable ?
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on
ne peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
A mon tour:
Quand on fait "a=3" suivi de "a=4", on n'a pas changé le 3 en 4:
on a simplement déplacé la variable a pour qu'elle indique une nouvelle
valeur.
La preuve:a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
Par contre, à partir de "a = [1,2,3]", si on fait "a[0] = 4",
l'affectation s'applique sur l'objet indiqué par a, et le modifie. La
preuve:a = [1, 2, 3]
b = a
print b
[1, 2, 3]a[0] = 4
print b
[4, 2, 3] # b change aussi!
C'est que a et b utilisent la même liste, et c'est elle que l'on a
modifié. Une liste est un objet mutable.
En python, les nombres (int, float, complex) et les chaines (str,
unicode) ne sont pas mutables: il n'y a aucune opération qui permet de
les modifier. C'est comme en Java, mais pas comme en C++.
La plupart des autres objets sont mutables; et je laisse à d'autres le
soin d'expliquer le cas du 'tuple'.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet
physique dans la mémoire (si j'ai bien compris). Chez moi, id() ne
donne pas une adresse mémoire (il me semble en tout cas car j'ai un
truc du genre "3079857356L"). Existe-t-il une instruction pour avoir
l'adresse mémoire d'une variable ?
Une adresse mémoire c'est un nombre aussi... Ou bien préfères-tu
l'afficher en base 16?print "0x%08x" % id(a)
0x00a659e0
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on
ne peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
A mon tour:
Quand on fait "a=3" suivi de "a=4", on n'a pas changé le 3 en 4:
on a simplement déplacé la variable a pour qu'elle indique une nouvelle
valeur.
La preuve:
a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
Par contre, à partir de "a = [1,2,3]", si on fait "a[0] = 4",
l'affectation s'applique sur l'objet indiqué par a, et le modifie. La
preuve:
a = [1, 2, 3]
b = a
print b
[1, 2, 3]
a[0] = 4
print b
[4, 2, 3] # b change aussi!
C'est que a et b utilisent la même liste, et c'est elle que l'on a
modifié. Une liste est un objet mutable.
En python, les nombres (int, float, complex) et les chaines (str,
unicode) ne sont pas mutables: il n'y a aucune opération qui permet de
les modifier. C'est comme en Java, mais pas comme en C++.
La plupart des autres objets sont mutables; et je laisse à d'autres le
soin d'expliquer le cas du 'tuple'.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet
physique dans la mémoire (si j'ai bien compris). Chez moi, id() ne
donne pas une adresse mémoire (il me semble en tout cas car j'ai un
truc du genre "3079857356L"). Existe-t-il une instruction pour avoir
l'adresse mémoire d'une variable ?
Une adresse mémoire c'est un nombre aussi... Ou bien préfères-tu
l'afficher en base 16?
print "0x%08x" % id(a)
0x00a659e0
Pouvez vous me dire ce que vous voulez dire par "immutables" ? Qu'on
ne peut pas modifier ? C'est ce à quoi j'ai pensé au départ. Mais j'ai
l'impression que ce n'est pas ça car les variables de type entiers ou
float sont modifiables.
A mon tour:
Quand on fait "a=3" suivi de "a=4", on n'a pas changé le 3 en 4:
on a simplement déplacé la variable a pour qu'elle indique une nouvelle
valeur.
La preuve:a = 3
b = a
a = 4
print b
3 # qui n'a pas changé, merci.
Par contre, à partir de "a = [1,2,3]", si on fait "a[0] = 4",
l'affectation s'applique sur l'objet indiqué par a, et le modifie. La
preuve:a = [1, 2, 3]
b = a
print b
[1, 2, 3]a[0] = 4
print b
[4, 2, 3] # b change aussi!
C'est que a et b utilisent la même liste, et c'est elle que l'on a
modifié. Une liste est un objet mutable.
En python, les nombres (int, float, complex) et les chaines (str,
unicode) ne sont pas mutables: il n'y a aucune opération qui permet de
les modifier. C'est comme en Java, mais pas comme en C++.
La plupart des autres objets sont mutables; et je laisse à d'autres le
soin d'expliquer le cas du 'tuple'.
Je ne vais pas tarder à poster un fil sur ce genre de considérations,
mais je profite de cette remarque pour poser la question suivante :
id() donne un identifiant d'une variable. Un même id() pour deux
variable signifie que le contenu des variable est le même objet
physique dans la mémoire (si j'ai bien compris). Chez moi, id() ne
donne pas une adresse mémoire (il me semble en tout cas car j'ai un
truc du genre "3079857356L"). Existe-t-il une instruction pour avoir
l'adresse mémoire d'une variable ?
Une adresse mémoire c'est un nombre aussi... Ou bien préfères-tu
l'afficher en base 16?print "0x%08x" % id(a)
0x00a659e0