Di dalam lingkup Python, setiap penugasan ke variabel yang belum dideklarasikan dalam lingkup itu menciptakan variabel lokal baru kecuali variabel itu dinyatakan sebelumnya dalam fungsi sebagai merujuk ke variabel cakupan global dengan kata kunci global
.
Mari kita lihat pseudocode versi modifikasi untuk melihat apa yang terjadi:
# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'
def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return x
def func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
Bahkan, Anda bisa menulis ulang semua func_B
dengan variabel bernama x_local
dan itu akan berfungsi secara identik.
Urutan hanya penting sejauh urutan di mana fungsi Anda melakukan operasi yang mengubah nilai global x. Jadi dalam contoh kami, pesanan tidak masalah, karena func_B
panggilan func_A
. Dalam contoh ini, pesanan memang penting:
def a():
global foo
foo = 'A'
def b():
global foo
foo = 'B'
b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.
Perhatikan bahwa global
hanya diperlukan untuk memodifikasi objek global. Anda masih dapat mengaksesnya dari dalam suatu fungsi tanpa mendeklarasikan global
. Jadi, kami memiliki:
x = 5
def access_only():
return x
# This returns whatever the global value of 'x' is
def modify():
global x
x = 'modified'
return x
# This function makes the global 'x' equal to 'modified', and then returns that value
def create_locally():
x = 'local!'
return x
# This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
Perhatikan perbedaan antara create_locally
dan access_only
- access_only
mengakses global x meskipun tidak menelepon global
, dan meskipun create_locally
tidak menggunakan global
keduanya, ia membuat salinan lokal karena ini memberikan nilai.
Kebingungan di sini adalah mengapa Anda tidak harus menggunakan variabel global.