Saya baru mengenal Python, jadi ini mungkin pertanyaan pelingkupan sederhana. Kode berikut dalam file Python (modul) sedikit membingungkan saya:
if __name__ == '__main__':
x = 1
print x
Dalam bahasa lain yang pernah saya gunakan, kode ini akan memberikan pengecualian, karena x
variabelnya lokal untuk if
pernyataan dan tidak boleh ada di luarnya. Tetapi kode ini mengeksekusi, dan mencetak 1. Adakah yang bisa menjelaskan perilaku ini? Apakah semua variabel dibuat dalam modul global / tersedia untuk seluruh modul?
if
pernyataan di atas tidak berlaku (yaitu,__name__
adalah tidak'__main__'
, misalnya ketika Anda mengimpor modul bukannya dijalankan tingkat atas), makax
tidak akan pernah telah terikat, dan selanjutnyaprint x
pernyataan akan melemparNameError: name 'x' is not defined
.Jawaban:
Variabel python di-scoped ke fungsi, kelas, atau modul terdalam di mana mereka ditugaskan. Blok kontrol suka
if
danwhile
blok tidak masuk hitungan, jadi variabel yang ditugaskan di dalamif
masih dibatasi untuk fungsi, kelas, atau modul.(Fungsi implisit yang didefinisikan oleh ekspresi generator atau pemahaman daftar / set / dikt benar- benar dihitung, seperti halnya ekspresi lambda. Anda tidak dapat memasukkan pernyataan penugasan ke dalam salah satu dari itu, tetapi parameter lambda dan
for
target klausa adalah penugasan implisit.)sumber
Ya, mereka berada di "cakupan lokal" yang sama, dan sebenarnya kode seperti ini adalah umum dalam Python:
Catatan yang
x
tidak dideklarasikan atau diinisialisasi sebelum kondisi, seperti itu akan di C atau Java, misalnya.Dengan kata lain, Python tidak memiliki cakupan level blok. Namun, berhati-hatilah dengan contoh-contoh seperti
yang jelas akan menimbulkan
NameError
pengecualian.sumber
Lingkup dalam python mengikuti urutan ini:
Cari ruang lingkup lokal
Cari ruang lingkup fungsi terlampir
Cari ruang lingkup global
Cari bawaan
( sumber )
Perhatikan bahwa
if
dan konstruksi pengulangan / percabangan lainnya tidak terdaftar - hanya kelas, fungsi, dan modul yang menyediakan ruang lingkup dengan Python, jadi apa pun yang dideklarasikan dalam sebuahif
blok memiliki cakupan yang sama dengan apa pun yang dideklarasikan di luar blok. Variabel tidak dicentang pada waktu kompilasi, itulah sebabnya bahasa lain memberikan pengecualian. Dalam python, selama variabel itu ada pada saat Anda memerlukannya, tidak ada pengecualian yang akan dibuang.sumber
Seperti yang Eli katakan, Python tidak memerlukan deklarasi variabel. Dalam C Anda akan mengatakan:
tetapi dalam deklarasi Python implisit, jadi ketika Anda menetapkan ke x itu secara otomatis dinyatakan. Itu karena Python diketik secara dinamis - itu tidak akan bekerja dalam bahasa yang diketik secara statis, karena tergantung pada jalur yang digunakan, variabel dapat digunakan tanpa dideklarasikan. Ini akan ditangkap pada waktu kompilasi dalam bahasa yang diketik secara statis, tetapi dengan bahasa yang diketik secara dinamis itu diizinkan.
Satu-satunya alasan bahwa bahasa yang diketik secara statis terbatas karena harus mendeklarasikan variabel di luar
if
pernyataan karena masalah ini. Rangkul dinamis!sumber
Tidak seperti bahasa seperti C, variabel Python berada dalam ruang lingkup untuk seluruh fungsi (atau kelas, atau modul) di mana ia muncul, bukan hanya di "blok" terdalam. Seolah-olah Anda menyatakan
int x
di bagian atas fungsi (atau kelas, atau modul), kecuali bahwa dalam Python Anda tidak harus mendeklarasikan variabel.Perhatikan bahwa keberadaan variabel
x
diperiksa hanya pada saat runtime - yaitu, ketika Anda sampai padaprint x
pernyataan. Jika__name__
tidak sama"__main__"
maka Anda akan mendapatkan pengecualian:NameError: name 'x' is not defined
.sumber
Iya. Itu juga berlaku untuk
for
ruang lingkup. Tapi tentu saja bukan fungsi.Dalam contoh Anda: jika kondisi dalam
if
pernyataan itu salah,x
tidak akan didefinisikan.sumber
Anda mengeksekusi kode ini dari baris perintah karena itu
if
kondisinya benar danx
diatur. Membandingkan:sumber
Dan perhatikan bahwa karena tipe Python hanya diperiksa saat runtime, Anda dapat memiliki kode seperti:
Tapi saya kesulitan memikirkan cara lain di mana kode akan beroperasi tanpa kesalahan karena masalah ketik.
sumber