suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Darf ich fragen, warum in Python, wenn ich eine for-Schleife verwende, um einer verschachtelten Liste einen Wert zuzuweisen, dieser immer auf der Grundlage des Endwerts von i berechnet wird?

Es gibt zwei Beispiele, das erste lautet wie folgt:

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

Zu diesem Zeitpunkt ist a=[3,4,5,6,7]
Der zweite lautet wie folgt:

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

Zu diesem Zeitpunkt ist a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

Warum passiert das? Stimmt etwas mit meiner zweiten Schreibweise nicht?
Neulinge, bitte gebt mir einen Rat!

扔个三星炸死你扔个三星炸死你2763 Tage vor983

Antworte allen(3)Ich werde antworten

  • 大家讲道理

    大家讲道理2017-06-12 09:27:09

    你这里犯了2个问题:
    第一个, 也就是楼上说得, 你一直是修改a[0]的值, 你并没有将变化的i放入列表去处理, 或者说, 你漏了把i写进题目中的代码:
    正确方法:

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

    第二个问题, 也就是你上面问得, 为什么a=[[0,0]]*5这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
    这个问题和第一个问题有个相同之处, 就是你应该是忘了写a[i][0] = i + 3,
    其次就是: 如果用[[0, 0]] * 5这样的方式生成的列表, 里面的全部都这是引用, 都是同一个对象, 并不是5个对象! 看例子:

    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

    可以通过id值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3时, 不管你修改第几个元素, 最终都只是修改同一个列表而已!
    所以如果想试下你想要的效果, 你就不能用那种方式快速生成列表,只能用下面的方法:

    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]]
    

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:27:09

    因为你要用i 变量进行迭代,你总是改变0的话,a[0] 当然被覆盖了,为最后一次的值
    第一次代码,也得不出a=[3,4,5,6,7],你得用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]

    第二次代码:

    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]

    好像是你代码写错了,我猜你想问这个问题

    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]]

    你可以把a打印出来

    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 说的是正确的

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:27:09

    实际上就是第2种方式是共享的,而不是单独形式了。因为此时是列表,是可变的,而第1种方式是数字,是不可变的。

    Antwort
    0
  • StornierenAntwort