Maison > Questions et réponses > le corps du texte
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 !
大家讲道理2017-06-12 09:27:09
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
放入列表去处理, 或者说, 你漏了把i
dans 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]] * 5
Cette question est similaire à la première question, c'est-à-dire que vous devriez avoir oublié d'écrire a[i][0] = i + 3
,
[[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+3
peut réussira = [[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]]
漂亮男人2017-06-12 09:27:09
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_u15822017-06-12 09:27:09
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.