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!
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
放入列表去处理, 或者说, 你漏了把i
ke dalam kod dalam soalan:Kaedah yang betul:
Soalan kedua, iaitu apa yang anda tanya di atas, ialah mengapa kaedah takrifan
Langkah kedua ialah: jika ia dijana menggunakana=[[0,0]]*5
ternyata 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]] * 5
Soalan ini serupa dengan soalan pertama, iaitu, anda patut saya terlupa untuk menulisa[i][0] = i + 3
,[[0, 0]] * 5
Senarai, semua dalam ia adalah rujukan, semuanya adalah objek yang sama, bukan 5 objek. Lihat contoh: Apabilaid
值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3
boleh 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:
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
Kod kedua:
Nampaknya awak salah tulis kod, agaknya awak nak tanya soalan ni
Anda boleh mencetak
@Lin_R betul
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.