Rumah > Soal Jawab > teks badan
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!
大家讲道理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
放入列表去处理, 或者说, 你漏了把i
ke 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]] * 5
Soalan ini serupa dengan soalan pertama, iaitu, anda patut saya terlupa untuk menulis a[i][0] = i + 3
,
[[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+3
boleh lulusa = [[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]]
漂亮男人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
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.