Bolehkah saya bertanya mengapa dalam Python, apabila saya menggunakan gelung for untuk menetapkan nilai kepada senarai bersarang, ia sentiasa dikira berdasarkan nilai akhir i?
扔个三星炸死你
扔个三星炸死你 2017-06-12 09:25:09
0
3
908

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!

扔个三星炸死你
扔个三星炸死你

membalas semua (3)
大家讲道理

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 perubahani放入列表去处理, 或者说, 你漏了把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 takrifana=[[0,0]]*5ternyata kesemuanyaa=[[ 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 menulisa[i][0] = i + 3,

Langkah kedua ialah: jika ia dijana menggunakan [[0, 0]] * 5Senarai, 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]]
    漂亮男人

    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

      phpcn_u1582

      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.

        Muat turun terkini
        Lagi>
        kesan web
        Kod sumber laman web
        Bahan laman web
        Templat hujung hadapan
        Tentang kita Penafian Sitemap
        Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!