Home  >  Q&A  >  body text

May I ask why in Python, when I use a for loop to assign a value to a nested list, it is always calculated based on the final value of i?

There are two examples, the first one is as follows,

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

At this time, a=[3,4,5,6,7]
The second one is as follows:

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

At this time, a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

Why does this happen? Is there anything wrong with my second way of writing?
Newbies, please give me some advice!

扔个三星炸死你扔个三星炸死你2686 days ago922

reply all(3)I'll reply

  • 大家讲道理

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

    You have made two problems here:
    The first one, as mentioned above, you have been modifying the value of a[0], and you have not put the changed i into the list for processing, or in other words, You missed the code to write i into the question:
    Correct method:

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

    The second question, which is what you asked above, is why a=[[0,0]]*5This definition method turns out to be a=[[7, 0], [7 , 0], [7, 0], [7, 0], [7, 0]]
    This question has one thing in common with the first question, that is, you probably forgot to write a[i][ 0] = i + 3,
    The second is: If you use [[0, 0]] * 5 to generate a list, everything in it is a reference, they are the same object, not 5 Object! See example:

    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

    You can see from the idvalue that they all have the same address, so the 5 objects in the list are all the same, so when you execute a[i][0]= i+3, no matter No matter which element you modify, you will end up modifying the same list!
    So if you want to try the effect you want, you can’t use that method to quickly generate a list, you can only use the following method:

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

    reply
    0
  • 漂亮男人

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

    Because you need to use the i variable to iterate, if you always change 0, a[0] will of course be overwritten, and it will be the last value
    In the first code, you cannot get a=[3,4,5, 6,7], you have to use the i variable

    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]

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

    It seems that you wrote the code wrong, I guess you want to ask this 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]]

    You can print out 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 is right

    reply
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:27:09

    In fact, the second method is shared, not separate. Because it is a list at this time and is variable, while the first method is a number and is immutable.

    reply
    0
  • Cancelreply