Puis-je demander pourquoi en Python, lorsque j'utilise une boucle for pour attribuer une valeur à une liste imbriquée, elle est toujours calculée en fonction de la valeur finale de i ?
扔个三星炸死你
扔个三星炸死你 2017-06-12 09:25:09
0
3
955

Il y a deux exemples, le premier est le suivant,

a=[0]*5
for i in range(5):
    a[0]=i+3

À ce moment, a=[3,4,5,6,7]
Le deuxième est le suivant :

a=[[0,0]]*5
for i in range(5):
    a[0]=i+3

À ce moment, a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

Pourquoi cela se produit-il ? Y a-t-il un problème avec ma deuxième façon d'écrire ?
Débutants, donnez-moi quelques conseils !

扔个三星炸死你
扔个三星炸死你

répondre à tous(3)
大家讲道理

Vous avez posé deux problèmes ici :
Le premier, comme mentionné ci-dessus, vous avez modifié la valeur de a[0], mais vous n'avez pas écrit la modification i放入列表去处理, 或者说, 你漏了把idans le code de la question :
Méthode correcte :

a = [0] * 5
for i in range(5):
    a[i] = i + 3
print a

La deuxième question, qui est celle que vous avez posée ci-dessus, est de savoir pourquoi la méthode de définition de a=[[0,0]]*5 s'avère être entièrement a=[[ 7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]a=[[0,0]]*5这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
这个问题和第一个问题有个相同之处, 就是你应该是忘了写a[i][0] = i + 3,
其次就是: 如果用[[0, 0]] * 5Cette question est similaire à la première question, c'est-à-dire que vous devriez avoir oublié d'écrire a[i][0] = i + 3,

La deuxième étape est la suivante : s'il est généré à l'aide de la liste [[0, 0]] * 5, tout ce qui est dans c'est une référence, ce sont tous le même objet, pas 5 objets Voir exemple :

a = [[0, 0]] * 5
print a
print id(a[0])
print id(a[1])
print id(a[2])

# 输出
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
42455688
42455688
42455688
Quand id值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3peut réussir
, peu importe le nombre d'éléments que vous modifiez, vous ne modifierez que la même liste à la fin !Donc, si vous voulez essayer l'effet que vous souhaitez, vous ne pouvez pas utiliser cette méthode pour générer rapidement une liste, vous ne pouvez utiliser que la méthode suivante :🎜
a = [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], ]
for i in range(5):
    a[i][0] = i + 3
print a

# 输出
[[3, 0], [4, 0], [5, 0], [6, 0], [7, 0]]
漂亮男人

Parce que vous devez utiliser la variable i pour itérer, si vous changez toujours 0, a[0] sera bien sûr écrasé, et ce sera la dernière valeur
Dans le premier code, vous ne pouvez pas obtenir a=[3,4 ,5, 6,7], vous devez utiliser la variable i

In [156]: a=[0]*5 
 ...: for i in range(5):
 ...:     a[0]=i+3
 ...:

In [157]: a
Out[157]: [7, 0, 0, 0, 0]

In [159]: a=[0]*5
     ...: for i in range(5):
     ...:     a[i]=i+3
     ...:
     ...:

In [160]:

In [160]: a
Out[160]: [3, 4, 5, 6, 7]

Deuxième code :

In [163]: a=[[0,0]]*5
     ...: for i in range(5):
     ...:     a[0]=i+3
     ...:

In [164]: a
Out[164]: [7, [0, 0], [0, 0], [0, 0], [0, 0]]

In [165]: a=[[0,0]]*5
     ...: for i in range(5):
     ...:     a[i]=i+3
     ...:
     ...:

In [166]: a
Out[166]: [3, 4, 5, 6, 7]

Il semble que vous ayez mal écrit le code, je suppose que vous voulez poser cette question

In [168]: a=[[0,0]]*5
 ...: for i in range(5):
 ...:     a[i][0]=i+3
 ...:
 ...:
 ...:

In [169]: a
Out[169]: [[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

Vous pouvez imprimer un

In [175]: a=[[0,0]]*5
 ...: for i in range(5):
 ...:     a[i][0]=i+3
 ...:     print(a,id(a[i]))
 ...:
[[3, 0], [3, 0], [3, 0], [3, 0], [3, 0]] 93411808
[[4, 0], [4, 0], [4, 0], [4, 0], [4, 0]] 93411808
[[5, 0], [5, 0], [5, 0], [5, 0], [5, 0]] 93411808
[[6, 0], [6, 0], [6, 0], [6, 0], [6, 0]] 93411808
[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]] 93411808

@Lin_R a raison

phpcn_u1582

En fait, la deuxième méthode est partagée et non séparée. Parce qu'il s'agit d'une liste à ce moment-là et qu'elle est variable, alors que la première méthode est un nombre et est immuable.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal