Maison  >  Questions et réponses  >  le corps du texte

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 ?

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 !

扔个三星炸死你扔个三星炸死你2686 Il y a quelques jours927

répondre à tous(3)je répondrai

  • 大家讲道理

    大家讲道理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放入列表去处理, 或者说, 你漏了把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]]
    

    répondre
    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

    répondre
    0
  • phpcn_u1582

    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.

    répondre
    0
  • Annulerrépondre