Menggunakan variabel global dalam fungsi
Bagaimana saya bisa membuat atau menggunakan global variabel dalam sebuah fungsi?
Jika saya membuat sebuah variabel global dalam satu fungsi, bagaimana saya bisa menggunakan global variable dalam fungsi lain? Apakah saya perlu untuk menyimpan variabel global dalam variabel lokal dari fungsi yang membutuhkan akses?
2925
18
Anda dapat menggunakan variabel global dalam fungsi-fungsi lain dengan menyatakan itu sebagai
global
di masing-masing fungsi yang ditunjuk untuk itu:Saya membayangkan alasan untuk ini adalah bahwa, sejak variabel global yang sangat berbahaya, Python ingin memastikan bahwa anda benar-benar tahu bahwa's apa yang anda're bermain dengan dengan secara eksplisit mewajibkan
global
kata kunci.Melihat jawaban yang lain jika anda ingin berbagi variabel global seluruh modul.
Jika saya'm memahami situasi anda dengan benar, apa yang anda're lihat adalah hasil dari bagaimana Python menangani lokal (fungsi) dan global (modul) namespaces.
Katakanlah anda've punya modul seperti ini:
Anda mungkin mengharapkan ini untuk mencetak 42, tapi bukannya mencetak 5. Seperti telah disebutkan di atas, jika anda menambahkan '
global
' deklarasi untukfunc1()
, kemudianfunc2()
akan mencetak 42.Apa's terjadi di sini adalah bahwa Python mengasumsikan bahwa setiap nama yang diberikan ke, di mana saja di dalam sebuah fungsi, adalah lokal untuk fungsi itu kecuali secara eksplisit mengatakan sebaliknya. Jika itu adalah hanya membaca dari sebuah nama, dan nama itu doesn't ada secara lokal, itu akan mencoba untuk mencari nama di setiap mengandung lingkup (misalnya, modul's lingkup global).
Ketika anda menetapkan 42 nama
myGlobal
, oleh karena itu, Python menciptakan variabel lokal bahwa bayangan global variabel dengan nama yang sama. Yang lokal keluar dari ruang lingkup dan mengumpulkan sampah ketikafunc1()
kembali; sementara itu,func2()
tidak akan pernah bisa melihat apa-apa selain dari (dimodifikasi) nama global. Catatan bahwa ini namespace keputusan yang terjadi pada waktu kompilasi, tidak pada saat runtime-jika anda adalah untuk membaca nilai darimyGlobal
dalamfunc1()
sebelum anda menetapkan untuk itu, anda'a mendapatkanUnboundLocalError
, karena Python telah memutuskan bahwa itu harus menjadi variabel lokal tetapi tidak memiliki nilai apapun yang terkait dengan itu belum. Tapi dengan menggunakan 'global
' pernyataan, anda memberitahu Python itu harus mencari tempat lain untuk nama bukan untuk menetapkan secara lokal.(Aku percaya bahwa perilaku ini berasal sebagian besar melalui optimalisasi lokal namespaces-tanpa perilaku ini, Python's VM akan perlu untuk melakukan setidaknya tiga nama lookup setiap kali nama baru ditugaskan ke dalam sebuah fungsi (untuk memastikan bahwa nama didn't sudah ada di modul/builtin tingkat), yang secara signifikan akan memperlambat sangat umum operasi.)
Anda mungkin ingin mengeksplorasi gagasan nama. Di Python, yang modul adalah tempat alami untuk global data:
Tertentu menggunakan global-in-a-modul ini dijelaskan di sini - Bagaimana cara berbagi variabel global seluruh modul?, dan untuk kelengkapan isi dibagi di sini:
Python menggunakan sederhana heuristik untuk menentukan ruang lingkup ini harus memuat variabel dari, antara lokal dan global. Jika nama variabel yang muncul di sisi kiri dari sebuah tugas, tapi tidak dideklarasikan secara global, hal ini diasumsikan lokal. Jika tidak muncul di sisi kiri dari sebuah tugas, hal ini diasumsikan untuk menjadi global.
Melihat bagaimana baz, yang muncul di sisi kiri dari tugas di
foo()
, adalah satu-satunyaLOAD_FAST
variabel.Jika anda ingin merujuk ke variabel global dalam fungsi, anda dapat menggunakan global kata kunci untuk mendeklarasikan variabel yang global. Anda don't harus menggunakannya dalam semua kasus (seperti seseorang di sini salah klaim) - jika nama yang direferensikan dalam sebuah ekspresi yang tidak dapat ditemukan di daerah lingkup atau cakupan dalam fungsi-fungsi di mana fungsi ini didefinisikan, hal ini tampak antara variabel global.
Namun, jika anda menetapkan ke new variabel tidak dideklarasikan sebagai global dalam fungsi, hal ini secara implisit dinyatakan sebagai lokal, dan dapat menaungi setiap ada global variabel dengan nama yang sama.
Juga, global variabel yang berguna, yang bertentangan dengan beberapa OOP fanatik yang mengklaim sebaliknya, terutama untuk script kecil, di mana OOP adalah berlebihan.
Di samping sudah ada jawaban dan untuk membuat ini lebih membingungkan:
Sumber: Apa aturan untuk lokal dan global variabel dalam Python?.
Kita dapat membuat global dengan fungsi berikut:
Menulis fungsi yang tidak benar-benar menjalankan kode. Jadi kita sebut
create_global_variable
fungsi:Menggunakan globals tanpa modifikasi
Anda hanya bisa menggunakannya, asalkan anda don't berharap untuk mengubah objek yang menunjuk ke:
Misalnya,
dan sekarang kita dapat menggunakan variabel global:
Modifikasi variabel global dari dalam fungsi
Untuk titik variabel global pada objek yang berbeda, anda diwajibkan untuk menggunakan global kata kunci lagi:
Perhatikan bahwa setelah menulis fungsi ini, kode benar-benar mengubah hal itu masih belum berjalan:
Jadi setelah memanggil fungsi:
kita bisa melihat bahwa variabel global telah berubah. The
global_variable
nama sekarang menunjuk ke'Bar'
:Perhatikan bahwa "global" dalam Python adalah tidak benar-benar global - it's hanya global ke tingkat modul. Jadi hal ini hanya tersedia untuk fungsi-fungsi yang ditulis dalam modul-modul yang lebih global. Fungsi mengingat modul di mana mereka ditulis, jadi ketika mereka yang diekspor ke modul lain, mereka masih terlihat dalam modul di mana mereka diciptakan untuk menemukan variabel global.
Variabel lokal dengan nama yang sama
Jika anda membuat variabel lokal dengan nama yang sama, itu akan menaungi variabel global:
Tapi menggunakan yang misnamed variabel lokal tidak mengubah variabel global:
Perhatikan bahwa anda harus menghindari menggunakan variabel lokal dengan nama yang sama seperti globals kecuali anda tahu persis apa yang anda lakukan dan memiliki alasan yang sangat baik untuk melakukannya. Saya belum pernah menjumpai alasan seperti itu.
Dengan eksekusi paralel, variabel global dapat menyebabkan hasil yang tak terduga jika anda don't memahami apa yang terjadi. Berikut adalah contoh penggunaan variabel global dalam multiprocessing. Kita dapat dengan jelas melihat bahwa masing-masing proses bekerja dengan copy dari variabel:
Output:
Ternyata jawabannya adalah selalu sederhana.
Berikut ini adalah contoh kecil modul dengan cara yang mudah untuk menunjukkan hal ini dalam
utama
definisi:Berikut ini adalah cara untuk menunjukkan hal ini dalam
utama
definisi:Ini kode sederhana bekerja hanya seperti itu, dan itu akan mengeksekusi. Saya harap ini membantu.
Apa yang anda katakan adalah dengan menggunakan metode seperti ini:
Tapi cara yang lebih baik adalah dengan menggunakan variabel global seperti ini:
Keduanya memberikan output yang sama.
Anda perlu referensi variabel global dalam setiap fungsi yang ingin anda gunakan.
Sebagai berikut:
Anda're tidak benar-benar menyimpan global variabel lokal, hanya menciptakan lokal referensi ke objek yang sama yang asli global mengacu pada. Ingat bahwa segala sesuatu cukup banyak di Python adalah sebuah nama yang mengacu pada suatu objek, dan tidak ada yang akan disalin dalam operasi yang biasa.
Jika anda didn't harus secara eksplisit menentukan ketika sebuah identifier untuk merujuk ke standar global, maka anda'd mungkin harus secara eksplisit menentukan ketika sebuah identifier adalah variabel lokal baru bukan (misalnya, dengan sesuatu seperti 'var' perintah yang terlihat dalam JavaScript). Karena variabel lokal adalah lebih umum daripada variabel global di setiap masalah yang serius dan non-sepele sistem, Python's sistem yang lebih masuk akal dalam kebanyakan kasus.
Anda bisa memiliki bahasa yang berusaha untuk menebak, menggunakan variabel global jika itu ada atau membuat variabel lokal jika tidak't. Namun, itu akan menjadi sangat rawan kesalahan. Misalnya, mengimpor modul lain bisa secara tidak sengaja memperkenalkan variabel global dengan nama itu, mengubah perilaku dari program anda.
Coba ini:
Dalam kasus anda memiliki variabel lokal dengan nama yang sama, anda mungkin ingin menggunakan
globals()
fungsi.Berikut di dan sebagai add on, menggunakan sebuah file yang berisi semua variabel global semua dinyatakan secara lokal dan kemudian
mengimpor
:File initval.py:
File getstocks.py:
Menulis untuk unsur eksplisit global array tidak tampaknya perlu deklarasi global, meskipun menulis itu "grosir" tidak memiliki persyaratan:
I'm menambahkan ini karena saya belum't melihat hal itu di setiap jawaban yang lain dan mungkin akan berguna bagi seseorang yang bergumul dengan sesuatu yang serupa. The
globals()
fungsi mengembalikan mutable global simbol kamus mana anda dapat "ajaib" membuat data yang tersedia untuk sisa dari kode anda. Misalnya:dan
Hanya akan membiarkan anda dump/memuat variabel-variabel yang keluar dari dan ke global namespace. Super nyaman, tidak ada pertengkaran, tidak ada ribut-ribut. Cukup yakin itu's Python 3 saja.
Referensi kelas namespace di mana anda ingin mengubah muncul.
Dalam contoh ini, pelari menggunakan max dari file config. Saya ingin saya tes untuk mengubah nilai max ketika pelari yang menggunakannya.
main/config.py
main/runner.py
tests/runner_test.py