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
957

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 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]]
漂亮男人

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