Saya tidak bertanya tentang aturan pelingkupan Python; Saya mengerti secara umum bagaimana pelingkupan bekerja di Python untuk loop. Pertanyaan saya adalah mengapa keputusan desain dibuat dengan cara ini. Misalnya (tidak ada permainan kata-kata):
for foo in xrange(10):
bar = 2
print(foo, bar)
Di atas akan dicetak (9,2).
Ini menurut saya aneh: 'foo' benar-benar hanya mengendalikan loop, dan 'bar' didefinisikan di dalam loop. Saya bisa mengerti mengapa mungkin perlu 'bar' untuk dapat diakses di luar loop (jika tidak, untuk loop akan memiliki fungsi yang sangat terbatas). Apa yang saya tidak mengerti adalah mengapa perlu untuk variabel kontrol untuk tetap berada dalam ruang lingkup setelah loop keluar. Dalam pengalaman saya, ini hanya mengacaukan namespace global dan membuatnya lebih sulit untuk melacak kesalahan yang akan ditangkap oleh penerjemah dalam bahasa lain.
for
loop mengacaukan namespace global Anda, bungkuslah dalam suatu fungsi. Closures berlimpah!Jawaban:
Jawaban yang paling mungkin adalah bahwa hal itu hanya membuat tata bahasa tetap sederhana, belum menjadi batu sandungan untuk adopsi, dan banyak yang senang karena tidak harus mengacaukan ruang lingkup di mana nama tersebut dimiliki ketika menetapkannya dalam konstruksi lingkaran. Variabel tidak dideklarasikan dalam lingkup, itu tersirat oleh lokasi pernyataan tugas. Kata
global
kunci ada hanya karena alasan ini (untuk menandakan bahwa penugasan dilakukan pada lingkup global).Memperbarui
Inilah diskusi yang bagus tentang topik ini: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
Singkatnya, Anda mungkin bisa menyalahkannya di komunitas Python: P
sumber
Python tidak memiliki blok, seperti halnya beberapa bahasa lain (seperti C / C ++ atau Java). Oleh karena itu, unit pelingkupan dalam Python adalah suatu fungsi.
sumber
for
adalah perpanjangan alami dari prinsip umum. Dalam Python itu harus menjadi kasus khusus, dan kasus-kasus khusus harus dihindari kecuali mereka memiliki manfaat menarik.Kasus yang sangat berguna untuk ini adalah ketika menggunakan
enumerate
dan Anda ingin jumlah total pada akhirnya:Apakah ini perlu? Tidak. Tapi, itu pasti nyaman.
Hal lain yang perlu diperhatikan: di Python 2, variabel dalam daftar pemahaman bocor juga:
Tapi, hal yang sama tidak berlaku untuk Python 3.
sumber
else
klausa, yaitu.else: print "I did something {0} times".format(count)
- sebelum lingkup lokal (yang tidak ada dalam Python) menghilangsomeiterator
kosong?else
klausa dapat digunakan dalam kasus ini, itu tidak akan berfungsi secara umum karena badan loop bisabreak
prematur.Jika Anda memiliki pernyataan break di loop (dan ingin menggunakan nilai iterasi nanti, mungkin untuk mengambil kembali, mengindeks sesuatu, atau memberikan status), itu akan menghemat satu baris kode dan satu tugas, jadi ada kemudahan.
sumber
Salah satu pengaruh utama Python adalah ABC , bahasa yang dikembangkan di Belanda untuk mengajarkan konsep pemrograman kepada pemula. Pencipta Python, Guido van Rossum, bekerja di ABC selama beberapa tahun pada 1980-an. Saya hampir tidak tahu apa-apa tentang ABC, tetapi karena ini ditujukan untuk pemula, saya kira itu harus memiliki cakupan yang terbatas, seperti BASIC awal.
sumber
Sebagai permulaan, jika variabel lokal untuk loop, loop tersebut tidak akan berguna untuk kebanyakan pemrograman dunia nyata.
Dalam situasi saat ini:
hasil panen
45
. Sekarang, pertimbangkan bagaimana tugas bekerja di Python. Jika variabel loop benar-benar lokal:menghasilkan
0
, karenatotal
di dalam loop setelah penugasan tidak variabel yang sama seperti ditotal
luar loop. Ini tidak akan menjadi perilaku yang optimal atau yang diharapkan.sumber
total
danfoo
masih memiliki ikatan local-loop dalam skenario OP dan logikanya sama.