Rumah  >  Soal Jawab  >  teks badan

Bolehkah saya bertanya mengapa dalam Python, apabila saya menggunakan gelung for untuk menetapkan nilai kepada senarai bersarang, ia sentiasa dikira berdasarkan nilai akhir i?

Ada dua contoh, yang pertama adalah seperti berikut,

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

Pada masa ini, a=[3,4,5,6,7]
Yang kedua adalah seperti berikut:

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

Pada masa ini, a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

Mengapa ini berlaku?
Pemula, sila beri saya nasihat!

扔个三星炸死你扔个三星炸死你2686 hari yang lalu928

membalas semua(3)saya akan balas

  • 大家讲道理

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

    Anda telah membuat dua masalah di sini:
    Yang pertama, seperti yang dinyatakan di atas, anda telah mengubah suai nilai a[0], tetapi anda belum menulis perubahan i放入列表去处理, 或者说, 你漏了把ike dalam kod dalam soalan:
    Kaedah yang betul:

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

    Soalan kedua, iaitu apa yang anda tanya di atas, ialah mengapa kaedah takrifan a=[[0,0]]*5 ternyata kesemuanya 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]] * 5Soalan ini serupa dengan soalan pertama, iaitu, anda patut saya terlupa untuk menulis a[i][0] = i + 3,

    Langkah kedua ialah: jika ia dijana menggunakan [[0, 0]] * 5 Senarai, semua dalam ia adalah rujukan, semuanya adalah objek yang sama, bukan 5 objek. Lihat contoh:

    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
    Apabila id值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3boleh lulus
    , tidak kira berapa banyak elemen yang anda ubah suai, anda hanya akan mengubah suai senarai yang sama pada akhirnya!

    Jadi jika anda ingin mencuba kesan yang anda inginkan, anda tidak boleh menggunakan kaedah itu untuk menjana senarai dengan cepat, anda hanya boleh menggunakan Kaedah berikut:🎜
    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]]
    

    balas
    0
  • 漂亮男人

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

    Oleh kerana anda perlu menggunakan pembolehubah i untuk lelaran, jika anda sentiasa menukar 0, a[0] sudah tentu akan ditimpa, dan ia akan menjadi nilai terakhir
    Dalam kod pertama, anda tidak boleh mendapatkan a=[3,4 ,5, 6,7], anda perlu menggunakan pembolehubah 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]

    Kod kedua:

    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]

    Nampaknya awak salah tulis kod, agaknya awak nak tanya soalan ni

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

    Anda boleh mencetak

    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 betul

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:27:09

    Malah, kaedah kedua dikongsi, bukan berasingan. Kerana ia adalah senarai pada masa ini dan berubah-ubah, manakala kaedah pertama ialah nombor dan tidak boleh diubah.

    balas
    0
  • Batalbalas