Bonjour,
Entre :
&
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [0,0]
Quelle affectation est la plus optimale?
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [0]*2
Bonjour,
Entre :
&
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [0,0]
Quelle affectation est la plus optimale?
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [0]*2
Salut,
Quand vous écrivez a = machin, l'assignation/affectation de l'objet machin à a n'a aucune raison de dépendre de la nature de l'objet machin.
Par contre la différence entre [0, 0], liste sous forme littérale contenant deux zéros, et [0]*2 qui fabrique une liste semblable à partir d'une liste réduite à 1 seul zéro saute au yeux: il suffit de regarder les opérations effectuées.
L'affectation coûte la même chose, la création/construction de l'objet à assigner, c'est autre chose. Ici, s'il y a une différence, elle sera "epsilonnesque" et n'aura d'importance que si l'opération sera répétée plusieurs millions de fois.
Maintenant, vous vous rendez aussi compte que fabriquer une liste à N éléments nuls sera possible avec [0]*N alors que sans connaitre N, impossible d'écrire çà sous forme littérale.
- W
Notez que l'affectation
est très dangereuse (et souvent ce n'est pas ce qu'on veut) si A n'est pas 0 comme dans votre exemple, mais plutôt un objet, ou plus généralement un mutable (une liste par exemple). Dans ces cas là, si on ne connait pas N à l'avance on devra instancier comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [A]*N
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [A for _ in range(N)]
suivit de:
Code : Sélectionner tout - Visualiser dans une fenêtre à part A = []
produira le même résultat que:
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ A for _ in range(N)]
car j'assigne dans les 2 cas N fois la référence au même objet A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ A ] * N
Et çà n'a rien à voir avec:
est identique à
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ [] for _ in range(N)]
dans le premier cas, je crée un objet liste vide [] à chaque itération alors que dans le 2nd je le recopie N fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ [] ] * N
Subtil?
- W
Effectivement, j'ai écrit comme cela (avec A) pour avoir une écriture plus compact, mais ca peut prêter à confusion.
Donc pour être clair, oui, dans ce que j'ai écrit il faut bien comprendre (pour l'exemple disons que A vaut [1,2,3]):
.vs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ [1,2,3] for _ in range(N)]
(qui produisent des résultats différents)
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ [1,2,3] ] * N
et non pas
puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part A=[1,2,3]
.vs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ A for _ in range(N)]
qui là en effet produisent la même chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part a = [ A ] * N
Donc si je récapitule:
IDEM : À a & b est assignées 2 fois la référence de tt, soit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 tt = [0,1] n =2 a = [tt for _ in range(n)] b = [tt] * n
Pour:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [[0, 1], [0, 1]] [[0, 1], [0, 1]]
IDENTIQUE : c est construit par la référence de tt à chaque itération alors que la référence de tt est copié dans d 2 fois, soit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 c = [[0,1] for _ in range(n)] d = [[0,1]] * n
Même procédé que pour c & d mais avec un résultat différent:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [[0, 1], [0, 1]] [[0, 1], [0, 1]]
Soit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 e = [[tt] for _ in range(n)] f = [[tt]] * n
Ai-je bien compris?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [[[0, 1]], [[0, 1]]] [[[0, 1]], [[0, 1]]]
Partager