Aku tahu aku harus menghindari penggunaan global variable di tempat pertama karena kebingungan seperti ini, tapi jika saya harus menggunakannya, berikut cara yang sah untuk pergi tentang menggunakan mereka? (Saya mencoba untuk memanggil global copy dari variabel yang dibuat dalam fungsi yang terpisah.)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x=func_A()
# Do things
return x
func_A()
func_B()
Apakah 'x' yang kedua menggunakan fungsi memiliki nilai yang sama global fotocopy 'x' yang 'func_a' menggunakan dan memodifikasi? Saat memanggil fungsi setelah definisi, apakah rangka peduli?
Jika anda hanya ingin mengakses variabel global anda hanya menggunakan namanya. Namun untuk **** perubahan nilai yang anda butuhkan untuk menggunakan global
kata kunci.
E. g.
global someVar
someVar = 55
Ini akan mengubah nilai dari variabel global ke 55. Jika tidak, itu hanya akan menetapkan 55 untuk variabel lokal.
Urutan fungsi definisi listing doesn't peduli (dengan asumsi mereka don't merujuk kepada satu sama lain dalam beberapa cara), urutan mereka disebut tidak.
Dalam Python ruang lingkup, tugas apapun untuk variabel yang belum dideklarasikan di dalam lingkup yang menciptakan variabel lokal baru kecuali variabel yang dideklarasikan di awal fungsi sebagai mengacu secara global cakupan variabel dengan kata kunci global
.
Let's lihat versi modifikasi dari pseudocode 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
Pada kenyataannya, anda bisa menulis ulang semua func_B
dengan variabel bernama x_local
dan itu akan bekerja dengan cara yang sama.
Urutan hal-hal yang hanya sejauh urutan di mana anda berfungsi melakukan operasi yang mengubah nilai global x. Dengan demikian dalam contoh kita, agar doesn't peduli, karena func_B
panggilan func_A
. Dalam contoh ini, perintah tidak peduli:
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 fungsi tanpa menyatakan global
.
Dengan demikian, kita 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 memanggil global
, dan bahkan create_locally
doesn't menggunakan global
baik, itu menciptakan salinan lokal sejak itu's menetapkan nilai.
Kebingungan di sini adalah mengapa anda tidak't menggunakan variabel global.
Seperti yang sudah diketahui, anda perlu mendeklarasikan variabel global
di sebuah fungsi bila anda ingin yang berfungsi untuk dapat memodifikasi variabel global. Jika anda hanya ingin mengaksesnya, maka anda don't perlu global
.
Untuk pergi ke lebih rinci tentang itu, apa "mengubah" artinya adalah ini: jika anda ingin re-mengikat nama global sehingga poin untuk objek yang berbeda, nama harus dinyatakan global
dalam fungsi.
Banyak operasi yang memodifikasi (bermutasi) sebuah objek tidak re-mengikat nama global untuk menunjuk ke objek yang berbeda, dan sehingga mereka semua valid tanpa menyatakan nama global
dalam fungsi.
d = {}
l = []
o = type("object", (object,), {})()
def valid(): # these are all valid without declaring any names global!
d[0] = 1 # changes what's in d, but d still points to the same object
d[0] += 1 # ditto
d.clear() # ditto! d is now empty but it`s still the same object!
l.append(0) # l is still the same list but has an additional member
o.test = 1 # creating new attribute on o, but o is still the same object
Berikut adalah salah satu kasus yang menarik saya keluar, menggunakan global sebagai nilai default dari parameter.
globVar = None # initialize value of global variable
def func(param = globVar): # use globVar as default value for param
print 'param =', param, 'globVar =', globVar # display values
def test():
global globVar
globVar = 42 # change value of global
func()
test()
=========
output: param = None, globVar = 42
Saya harapkan param memiliki nilai 42. Mengejutkan. Python 2.7 dievaluasi nilai globVar ketika pertama kali diuraikan fungsi func. Mengubah nilai globVar tidak mempengaruhi nilai default ditugaskan untuk param. Menunda evaluasi, sebagai berikut, bekerja seperti yang saya butuhkan untuk.
def func(param = eval('globVar')): # this seems to work
print 'param =', param, 'globVar =', globVar # display values
Atau, jika anda ingin aman,
def func(param = None)):
if param == None:
param = globVar
print 'param =', param, 'globVar =', globVar # display values
Anda dapat langsung mengakses variabel global dalam fungsi. Jika anda ingin mengubah nilai dari variabel global, gunakan "global variable_name". Lihat contoh berikut:
var = 1
def global_var_change():
global var
var = "value changed"
global_var_change() #call the function for changes
print var
Secara umum, ini adalah praktek pemrograman yang baik. Dengan melanggar namespace logika, kode dapat menjadi sulit untuk memahami dan debug.
Anda harus menggunakan global
deklarasi ketika anda ingin mengubah nilai yang diberikan untuk variabel global.
Anda tidak perlu untuk baca dari variabel global. Perhatikan bahwa memanggil metode pada objek (bahkan jika itu mengubah data di dalam objek itu) tidak mengubah nilai dari variabel yang memegang benda itu (absen reflektif sihir).