Segala sesuatu yang Anda ingin tahu tentang lingkup di Python, tetapi malu untuk bertanya

Untuk mengantisipasi dimulainya utas baru pada kursus "Pengembang Python" , kami memutuskan untuk berbicara tentang cakupan dalam Python. Apa yang terjadi dengan ini? - Baca materi di bawah ini.




Hari ini kita akan berbicara tentang landasan teori penting yang harus dipahami dan diingat untuk menulis kode yang kompeten, mudah dibaca, dan indah. Kami akan berbicara tentang ruang lingkup variabel. Artikel ini akan berguna tidak hanya untuk pemula, tetapi juga untuk programmer berpengalaman yang datang ke Python dari bahasa lain dan ingin memahami mekanismenya.

Lingkup menentukan di bagian mana dari program kita dapat bekerja dengan variabel tertentu, dan dari mana variabel "tersembunyi". Sangat penting untuk memahami bagaimana hanya menggunakan nilai-nilai dan variabel yang kita butuhkan, dan bagaimana perilaku penerjemah bahasa. Kami juga akan melihat cara menghindari pembatasan yang diberlakukan oleh ruang lingkup pada tindakan dengan variabel. Dalam Python, ada sebanyak 3 cakupan:

  • Lokal
  • Global
  • Nonlokal

Terakhir, lingkup nonlokal, ditambahkan dengan Python 3.

Biasanya, kita berbicara tentang ruang lingkup ketika terbiasa dengan fungsi. Dengan menggunakan contoh mereka, kami akan mempertimbangkan pekerjaan lingkup variabel.

Ruang lingkup lokal


Pertimbangkan fungsi yang menampilkan some_listelemen daftar oleh elemen:

def print_list(some_list):
    for element in some_list:
        print(element)

Di sini elementdan some_listada variabel lokal yang hanya terlihat di dalam fungsi, dan yang tidak dapat digunakan di luarnya dengan nilai yang ditugaskan padanya di dalam fungsi selama operasinya. Artinya, jika kita memanggil bagian utama dari program print(element), kita mendapatkan kesalahan:

NameError: name 'element' is not defined


Sekarang kita akan melakukan hal berikut:

def print_list(some_list):
    for element in some_list:
        print(element) 

element = 'q'
print_list([1, 2, 3])
print(element) 


Dan kita mendapatkan:

1
2
3
q

Di sini variabel elementdi dalam fungsi dan variabel dengan nama yang sama di luarnya adalah dua variabel yang berbeda, nilainya tidak bersilangan dan tidak saling bertukar. Mereka disebut sama, tetapi merujuk ke berbagai objek dalam memori. Selain itu, elemen bernama variabel di dalam fungsi hidup selama fungsi dieksekusi dan tidak lebih. Tapi hati-hati untuk memberikan variabel lokal dan global nama yang sama, sekarang saya akan menunjukkan alasannya:

def print_list(some_list):
    for element in sudden_list:
        print(element) 

sudden_list = [0, 0, 0]
print_list([1, 2, 3])

Hasil:

0
0
0

Harap perhatikan bahwa penerjemah tidak menunjukkan kesalahan kepada kami. Dan semua itu karena sudden_listberada dalam ruang lingkup global, yaitu dari dalam fungsi print_listkita dapat mengaksesnya, karena dari dalam Anda dapat melihat apa yang terjadi di luar. Untuk alasan mekanisme kerja seperti itu, cobalah untuk menyebutkan variabel lokal di dalam fungsi secara berbeda dari apa yang Anda sebut variabel dalam lingkup global.

Penting untuk berbicara tentang konstanta di sini. Tidak ada perbedaan pada juru bahasa Python apa yang Anda sebut variabel, jadi kode di atas akan lebih baik ditulis ulang sebagai berikut:

SUDDEN_LIST = [0, 0, 0]

def print_list(some_list):
    for element in SUDDEN_LIST:
        print(element) 

print_list([1, 2, 3]) 

Sekarang semuanya ada di tempatnya. Masalahnya adalah, dalam Python Anda entah bagaimana tidak dapat secara ketat mendefinisikan konstanta sebagai objek yang tidak boleh dimodifikasi. Jadi cara Anda menggunakan nilai variabel yang namanya ditulis dengan huruf kapital tetap hanya pada hati nurani Anda. Pertanyaan lain adalah bahwa dengan cara ini variabel yang direkam akan menjelaskan kepada siapa pun yang membaca kode Anda bahwa variabel tidak akan berubah di mana pun. Atau setidaknya tidak seharusnya.

Ruang lingkup global


Python memiliki kata kunci globalyang memungkinkan Anda mengubah nilai variabel global dari dalam suatu fungsi. Itu ditulis sebelum nama variabel, yang akan dianggap global di dalam fungsi. Seperti yang Anda lihat dari contoh, sekarang nilai variabel candymeningkat, dan perhatikan bahwa kami tidak meneruskannya sebagai argumen ke fungsi get_candy().

candy = 5

def get_candy():
    global candy 
    candy += 1
    print('  {} .'.format(candy))
    
get_candy()
get_candy()
print(candy)


Sebagai hasilnya, kita mendapatkan:


	  6 .
  7 .
7


Namun, mengubah nilai variabel global dari dalam fungsi bukanlah praktik terbaik, dan lebih baik tidak melakukannya, karena itu tidak berkontribusi terhadap keterbacaan kode. Semakin kecil apa yang terjadi di dalam fungsi akan tergantung pada ruang lingkup global, semakin baik.

Peretasan kehidupan : Agar tidak mengalami penamaan variabel, Anda dapat memasukkan kode program utama ke dalam suatu fungsi main(), maka semua variabel yang akan dideklarasikan di dalam fungsi ini akan tetap lokal dan tidak akan merusak lingkup global, meningkatkan kemungkinan kesalahan.

Lingkup nonlokal


Konsep ini muncul dalam Python 3 bersama dengan kata kunci nonlocal. Logika tulisannya hampir sama dengan global. Namun, nonlocalada fitur. NonlocalIni paling sering digunakan dalam fungsi bersarang ketika kita ingin membuat penerjemah mengerti bahwa untuk fungsi bersarang variabel tertentu bukan lokal, tetapi itu tidak global dalam arti umum.

def get_candy():
    candy = 5
    def increment_candy(): 
        nonlocal candy
        candy += 1
        return candy
    return increment_candy
    
result = get_candy()()
print(' {} .'.format(result))

Hasil:

 6 .

Betapa berguna bagi Anda untuk memutuskan sendiri. Anda dapat menemukan lebih banyak contoh di sini .

Sebagai kesimpulan, beberapa aturan dapat dirumuskan:

  1. Dari dalam fungsi terlihat variabel yang telah didefinisikan baik di dalam maupun di luarnya. Variabel yang didefinisikan secara internal adalah lokal dan global.
  2. Di luar fungsi, tidak ada variabel yang didefinisikan di dalamnya yang terlihat.
  3. , global.
  4. nonlocal , , .

Itu saja, saya harap materi ini bermanfaat bagi Anda, dan itu memberi sedikit informasi tentang bagaimana ruang lingkup bekerja di Python. Setelah berurusan dengan cakupan, Anda akan membuat milik kita yang lain dalam cara membuat kode yang indah dan mudah dibaca.

Saya juga ingin mengundang semua orang ke webinar gratis dari OTUS, tempat kami akan mempelajari alat seperti mengetik anotasi dengan Python: kami akan membahas alasan mengapa banyak orang meremehkannya, mempertimbangkan sejumlah contoh dari praktik militer ketika anotasi jenis dapat menyelamatkan atau menyelamatkan situasi. Mari kita bicara tentang bagaimana dan kapan menerapkan tipe memeriksa proyek Anda .

All Articles