Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0]
* 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
Merci !
liste = [0]
print liste*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
liste = [[0],[1]]
print liste*10
[[0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1],
liste = [[2]]
print liste*10
[[2], [2], [2], [2], [2], [2], [2], [2], [2], [2]]
liste = [[0,1],[1,2]]
print liste*10
[[0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1],
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0]
* 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
Merci !
liste = [0]
print liste*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
liste = [[0],[1]]
print liste*10
[[0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1],
liste = [[2]]
print liste*10
[[2], [2], [2], [2], [2], [2], [2], [2], [2], [2]]
liste = [[0,1],[1,2]]
print liste*10
[[0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1],
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0]
* 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
Merci !
liste = [0]
print liste*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
liste = [[0],[1]]
print liste*10
[[0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1], [0], [1],
liste = [[2]]
print liste*10
[[2], [2], [2], [2], [2], [2], [2], [2], [2], [2]]
liste = [[0,1],[1,2]]
print liste*10
[[0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1], [1, 2], [0, 1],
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
[[0,0,0]]*100
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
Est-ce qu'il y a une solution plus élégante ?
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
[[0,0,0]]*100
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
Est-ce qu'il y a une solution plus élégante ?
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
[[0,0,0]]*100
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
Est-ce qu'il y a une solution plus élégante ?
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0] *
100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0,
titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0,
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0] *
100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0,
titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0,
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi = [0] *
100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution plus
élégante ?
titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0,
titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0,
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi > > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi > > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :
titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :
titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi > > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
On Tue, 10 Aug 2004 11:01:54 +0200, Sylvain ThenaultBonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi >> > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
Par contre si tab est une valeur, dans ce cas il n'y a plus de notion de
passage par référence et on a bien des éléments indépendants ?
[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
On Tue, 10 Aug 2004 11:01:54 +0200, Sylvain Thenault
Bonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi >> > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :
titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :
titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
Par contre si tab est une valeur, dans ce cas il n'y a plus de notion de
passage par référence et on a bien des éléments indépendants ?
[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
On Tue, 10 Aug 2004 11:01:54 +0200, Sylvain ThenaultBonjour,
Je débute en Python et je viens de tomber sur mon premier truc
'bizarre'...
Pourquoi lorsque je fais :
toto = [0] * 100
toto est bien une liste de 100 éléments indépendants
et lorsque je fais :
titi = [[0,0,0]] * 100
titi n'est pas une liste de 100 triplets indépendants ?
Je n'ai du coup pas trouvé mieux que la solution suivante : titi >> > [0] * 100
for i in range(100):
titi[i] = [0,0,0]
Quelle est ma faute de raisonnement ? Est-ce qu'il y a une solution
plus élégante ?
J'ai un doute sur ce que tu appelles "indépendant", mais je vais
essayer quand même de répondre...
En python, il faut garder à l'esprit que tout est référence (pointeur
pour ceux qui viennent du C). Quand tu fais :
titi = [[0,0,0]] * 100
tu crées une liste de 3 entiers, que tu répètes 100 fois. Tu te
retrouves donc avec une liste contenant 100 fois une référence vers la
même liste. Ce qui implique donc :titi[0][0] = 1
titi
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1,
0,
<snip>...]
Si tu veux avoir une liste contenant 100 listes de 3 entiers et non
100 références vers une même liste, tu peux utiliser une compréhension
de liste par exemple :
titi = [[0,0,0] for i in range(100)]
ici, la liste [0,0,0] est créée à chaque itération, donc tu obtiens
bien des références vers 100 listes différentes, et ce coup-ci :titi[0][0] = 1
titi
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0,
0,
<snip>...]
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
Par contre si tab est une valeur, dans ce cas il n'y a plus de notion de
passage par référence et on a bien des éléments indépendants ?
[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.
Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:
[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
On Wed, 11 Aug 2004 10:34:54 +0200, Sylvain ThenaultAh d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
Alors là je suis encore plus embrouillé, si c'est le même objet à chaque
fois dans le tableau : [0] * 10
Pourquoi est-ce que je peux modifier chacun des éléments indépendamment
?
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0][0] = 1
l1
[[1], [1], [1]]
l1[0] = [2]
l1
[[2], [1], [1]]
l2[0] = 3
l2
[3, 0, 0]
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
On Wed, 11 Aug 2004 10:34:54 +0200, Sylvain Thenault
Ah d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.
Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:
[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
Alors là je suis encore plus embrouillé, si c'est le même objet à chaque
fois dans le tableau : [0] * 10
Pourquoi est-ce que je peux modifier chacun des éléments indépendamment
?
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0][0] = 1
l1
[[1], [1], [1]]
l1[0] = [2]
l1
[[2], [1], [1]]
l2[0] = 3
l2
[3, 0, 0]
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
On Wed, 11 Aug 2004 10:34:54 +0200, Sylvain ThenaultAh d'accord.
Lorsque je tape [[0,0,0]] * N en fait c'est comme ci je faisais un
[tab] * N et c'est le même tableau tab qui est répété N fois ?
Parce qu'il est passé en référence ?
oui. Cela revient à faire :
tab = [0,0,0]
titi = [tab]*N
tab est une référence vers une liste de trois entier, de même que titi
est une référence vers une autre liste, de N élements (ici N
références vers la même liste de 3 entier). Pour résumer : en python,
on a pas de variables, uniquement des références vers des objets.Par contre si tab est une valeur, dans ce cas il n'y a plus de
notion de passage par référence et on a bien des éléments
indépendants ?
si, on a _toujours_ un passage par référence:[id(i) for i in [0]*10]
[135523068, 135523068, 135523068, 135523068, 135523068, 135523068,
135523068, 135523068, 135523068, 135523068]
la différence c'est que en python, certains objet comme les nombres
(entiers, flottants) et les chaines de caractères sont immuables (non
modifiables).
Alors là je suis encore plus embrouillé, si c'est le même objet à chaque
fois dans le tableau : [0] * 10
Pourquoi est-ce que je peux modifier chacun des éléments indépendamment
?
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0][0] = 1
l1
[[1], [1], [1]]
l1[0] = [2]
l1
[[2], [1], [1]]
l2[0] = 3
l2
[3, 0, 0]
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
t = ([0],) * 3
t
([0], [0], [0])
t[0] += [1]
Traceback (most recent call last):
t
([0, 1], [0, 1], [0, 1])
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
t = ([0],) * 3
t
([0], [0], [0])
t[0] += [1]
Traceback (most recent call last):
t
([0, 1], [0, 1], [0, 1])
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
t = ([0],) * 3
t
([0], [0], [0])
t[0] += [1]
Traceback (most recent call last):
t
([0, 1], [0, 1], [0, 1])
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
Eric Brunel wrote:
[snip]En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
Juste histoire de rajouter un autre cas bien pourri:t = ([0],) * 3
t
([0], [0], [0])t[0] += [1]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignmentt
([0, 1], [0, 1], [0, 1])
Un petit indice: tout ça a à voir avec le caractères "mutable" /
"immutable" des objets Python et avec la façon de fonctionner de
l'opérateur +
Là par contre je ne comprends plus...
Eric Brunel wrote:
[snip]
En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:
l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]
l2
[0, 0, 0]
l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]
l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
Juste histoire de rajouter un autre cas bien pourri:
t = ([0],) * 3
t
([0], [0], [0])
t[0] += [1]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
t
([0, 1], [0, 1], [0, 1])
Un petit indice: tout ça a à voir avec le caractères "mutable" /
"immutable" des objets Python et avec la façon de fonctionner de
l'opérateur +
Là par contre je ne comprends plus...
Eric Brunel wrote:
[snip]En fait, là où je comprendrais que tu sois complètement embrouillé,
c'est avec ce cas là:l1 = [[0]] * 3
l2 = [0] * 3
l1
[[0], [0], [0]]l2
[0, 0, 0]l1[0] += [1]
l2[0] += 1
l1
[[0, 1], [0, 1], [0, 1]]l2
[1, 0, 0]
Quand tu auras compris pourquoi ça fait ça, tu n'auras plus rien à
apprendre sur la façon de Python de gérer les variables.
Je te laisses réfléchir ;-)
Juste histoire de rajouter un autre cas bien pourri:t = ([0],) * 3
t
([0], [0], [0])t[0] += [1]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignmentt
([0, 1], [0, 1], [0, 1])
Un petit indice: tout ça a à voir avec le caractères "mutable" /
"immutable" des objets Python et avec la façon de fonctionner de
l'opérateur +
Là par contre je ne comprends plus...