Apa yang saya pahami dari membaca dokumentasi adalah bahwa Python memiliki namespace terpisah untuk fungsi, dan jika saya ingin menggunakan variabel global dalam fungsi itu, saya perlu menggunakannya global
.
Saya menggunakan Python 2.7 dan saya mencoba tes kecil ini
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Tampaknya semuanya berjalan dengan baik bahkan tanpa itu global
. Saya dapat mengakses variabel global tanpa masalah.
Apakah saya kehilangan sesuatu? Juga, berikut ini dari dokumentasi Python:
Nama-nama yang tercantum dalam pernyataan global tidak boleh didefinisikan sebagai parameter formal atau dalam target kontrol loop, definisi kelas, definisi fungsi, atau pernyataan impor.
Sementara parameter formal dan definisi kelas masuk akal bagi saya, saya tidak dapat memahami batasan untuk target kontrol loop dan definisi fungsi.
def foo(): ...
danfoo = ...
pada saat yang sama). Itu membuat ruang lingkup baru untuk setiap panggilan fungsi. (Tapi apa bedanya dengan hampir semua bahasa tingkat tinggi lain di dunia?)Jawaban:
Kata kunci
global
hanya berguna untuk mengubah atau membuat variabel global dalam konteks lokal, meskipun membuat variabel global jarang dianggap sebagai solusi yang baik.Di atas akan memberi Anda:
Sementara jika Anda menggunakan
global
pernyataan, variabel akan tersedia "di luar" ruang lingkup fungsi, secara efektif menjadi variabel global.Jadi kode di atas akan memberi Anda:
Selain itu, karena sifat python, Anda juga bisa menggunakan
global
untuk mendeklarasikan fungsi, kelas atau objek lain dalam konteks lokal. Meskipun saya akan menyarankan itu karena hal itu menyebabkan mimpi buruk jika terjadi kesalahan atau perlu debugging.sumber
globals
secara otomatis didefinisikan di semua ruang nama (untungnya). Seperti yang Anda tunjukkan dengan benar, global terikat ke namespace di dalam modul, namun itu dapat diimpor ke modul lain sebagaifrom module import variable
atauimport module.variable
. Dalam kasus pertama, impor akan membuat variabel dapat diaksesvariable
tanpa memerlukan referensi sebagaimodule.
. Jika dianggap global dalam cakupan modul akan tergantung pada tempat diimpornya. Lihat juganonlocal
sebagai kata kunci terkait lingkup baru di python 3.Meskipun Anda dapat mengakses variabel global tanpa
global
kata kunci, jika Anda ingin mengubahnya, Anda harus menggunakanglobal
kata kunci. Sebagai contoh:Dalam kasus Anda, Anda hanya mengakses daftar
sub
.sumber
foo = 3
tanpa karya global, tetapi foo didefinisikan kembali secara lokal dalamblub
lingkup fungsi & tidak mengubah variabel foo asli. Ini cukup membingungkan bagi saya.Ini adalah perbedaan antara mengakses nama dan mengikatnya dalam lingkup.
Jika Anda hanya mencari variabel untuk membaca nilainya, Anda memiliki akses ke lingkup global maupun lokal.
Namun jika Anda menetapkan ke variabel yang namanya tidak ada dalam lingkup lokal, Anda mengikat nama itu ke dalam lingkup ini (dan jika nama itu juga ada sebagai global, Anda akan menyembunyikannya).
Jika Anda ingin dapat menetapkan nama global, Anda perlu memberi tahu parser untuk menggunakan nama global daripada mengikat nama lokal baru - yang merupakan apa yang dilakukan kata kunci 'global'.
Mengikat di mana saja di dalam blok menyebabkan nama di mana saja di blok itu menjadi terikat, yang dapat menyebabkan beberapa konsekuensi yang agak aneh (mis. UnboundLocalError tiba-tiba muncul di kode yang sebelumnya berfungsi).
sumber
Jawaban lainnya menjawab pertanyaan Anda. Hal penting lain yang perlu diketahui tentang nama-nama dalam Python adalah bahwa mereka adalah lokal atau global berdasarkan basis per cakupan.
Pertimbangkan ini, misalnya:
Anda mungkin bisa menebak bahwa
value = 0
pernyataan akan menugaskan ke variabel lokal dan tidak mempengaruhi nilai variabel yang sama yang dinyatakan di luardoit()
fungsi. Anda mungkin lebih terkejut menemukan bahwa kode di atas tidak akan berjalan. Pernyataanprint value
di dalam fungsi menghasilkan sebuahUnboundLocalError.
Alasannya adalah bahwa Python telah memperhatikan bahwa, di tempat lain dalam fungsi, Anda menetapkan nama
value
, dan jugavalue
tidak dideklarasikan di mana punglobal
. Itu membuatnya menjadi variabel lokal. Tetapi ketika Anda mencoba untuk mencetaknya, nama lokal belum didefinisikan. Python dalam kasus ini tidak kembali mencari nama sebagai variabel global, seperti beberapa bahasa lainnya. Pada dasarnya, Anda tidak dapat mengakses variabel global jika Anda telah mendefinisikan variabel lokal dengan nama yang sama di mana saja dalam fungsi.sumber
global
(ataunonlocal
dengan Python 3.x) mengesampingkan perilaku ini dan memungkinkan Anda untuk menetapkan kembali nama eksternal.let
yang tidak mengangkat.global
atau tidak masalah?Mengakses nama dan menetapkan nama berbeda. Dalam kasus Anda, Anda hanya mengakses nama.
Jika Anda menetapkan variabel dalam suatu fungsi, variabel itu dianggap lokal kecuali Anda mendeklarasikannya global. Dengan tidak adanya itu, diasumsikan global.
sumber
global
Contoh:
sumber
Setiap variabel yang dideklarasikan di luar suatu fungsi dianggap global, hanya ketika menyatakannya dari dalam fungsi (kecuali konstruktor) Anda harus menentukan bahwa variabel tersebut bersifat global.
sumber
Ini dijelaskan dengan baik di FAQ Python
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
sumber
Ini berarti Anda tidak boleh melakukan hal berikut:
sumber
Global membuat variabel "Global"
Ini membuat 'x' bertindak seperti variabel normal di luar fungsi. Jika Anda mengeluarkan global maka itu akan memberikan kesalahan karena tidak dapat mencetak variabel di dalam suatu fungsi.
sumber