Saya tahu saya harus menghindari menggunakan variabel global karena kebingungan seperti ini, tetapi jika saya menggunakannya, apakah mengikuti cara yang valid untuk menggunakannya? (Saya mencoba memanggil salinan global dari variabel yang dibuat dalam fungsi 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
fungsi kedua yang digunakan memiliki nilai yang sama dari salinan global x
yang func_a
menggunakan dan memodifikasi? Saat memanggil fungsi setelah definisi, apakah urutan penting?
python
global-variables
Akshat Shekhar
sumber
sumber
Jawaban:
Jika Anda hanya ingin mengakses variabel global, Anda cukup menggunakan namanya. Namun untuk mengubah nilainya, Anda perlu menggunakan
global
kata kunci.Misalnya
Ini akan mengubah nilai variabel global menjadi 55. Kalau tidak, itu hanya akan menetapkan 55 ke variabel lokal.
Urutan daftar definisi fungsi tidak masalah (dengan asumsi mereka tidak merujuk satu sama lain dalam beberapa cara), urutan mereka dipanggil tidak.
sumber
x
infunc_B
adalah variabel lokal yang mendapatkan nilainya dari nilai pengembalian panggilan kefunc_A
- jadi saya kira itu akan menjadikannya sebagai Anda (2)func_A
mengubah variabel global selama setiap proses dan mengembalikannyafunc_B
untuk digunakan, makafunc_B
akan bekerja dengan nilai yang diubah setiap kali. Saya tidak yakin tentang "cara memperbaikinya". Anda mungkin ingin menerima jawaban yang paling membantu untuk pertanyaan Anda saat ini / asli dan kemudian mempertimbangkan untuk membuka pertanyaan lain tentang apa yang tampak seperti pertanyaan tindak lanjut.x.append("...")
, itu adalah variabel global x yang diubah, karena yang lokal merujuk yang global.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:
Bahkan, Anda bisa menulis ulang semua
func_B
dengan variabel bernamax_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
panggilanfunc_A
. Dalam contoh ini, pesanan memang penting:Perhatikan bahwa
global
hanya diperlukan untuk memodifikasi objek global. Anda masih dapat mengaksesnya dari dalam suatu fungsi tanpa mendeklarasikanglobal
. Jadi, kami memiliki:Perhatikan perbedaan antara
create_locally
danaccess_only
-access_only
mengakses global x meskipun tidak meneleponglobal
, dan meskipuncreate_locally
tidak menggunakanglobal
keduanya, ia membuat salinan lokal karena ini memberikan nilai.Kebingungan di sini adalah mengapa Anda tidak harus menggunakan variabel global.
sumber
Seperti yang telah dicatat orang lain, Anda perlu mendeklarasikan variabel
global
dalam suatu fungsi ketika Anda ingin fungsi itu dapat memodifikasi variabel global. Jika Anda hanya ingin mengaksesnya, maka Anda tidak perluglobal
.Untuk sedikit lebih mendetail tentang hal itu, apa artinya "memodifikasi" adalah ini: jika Anda ingin mengikat kembali nama global sehingga menunjuk ke objek yang berbeda, nama harus dideklarasikan
global
dalam fungsi.Banyak operasi yang memodifikasi (bermutasi) suatu objek tidak mengikat kembali nama global untuk menunjuk ke objek yang berbeda, sehingga semuanya valid tanpa menyatakan nama
global
dalam fungsi.sumber
Berikut adalah satu kasus yang menarik saya, menggunakan global sebagai nilai default dari suatu parameter.
Saya berharap param memiliki nilai 42. Kejutan. Python 2.7 mengevaluasi nilai globVar ketika pertama-tama menguraikan fungsi func. Mengubah nilai globVar tidak memengaruhi nilai default yang ditetapkan untuk param. Menunda evaluasi, seperti yang berikut ini, bekerja sesuai kebutuhan saya.
Atau, jika Anda ingin aman,
sumber
is
untuk memeriksa apakah ada sesuatuNone
, bukan perbandingan normal==
.Anda dapat langsung mengakses variabel global di dalam suatu fungsi. Jika Anda ingin mengubah nilai variabel global itu, gunakan "global variable_name". Lihat contoh berikut:
Secara umum, ini bukan praktik pemrograman yang baik. Dengan memecah logika namespace, kode bisa menjadi sulit dipahami dan didebug.
sumber
Anda harus menggunakan
global
deklarasi ketika Anda ingin mengubah nilai yang diberikan ke variabel global.Anda tidak perlu membaca dari variabel global. Perhatikan bahwa memanggil metode pada objek (bahkan jika itu mengubah data di dalam objek itu) tidak mengubah nilai variabel yang menahan objek tersebut (absen sihir reflektif).
sumber
xs.append(xs.pop(0))
bekerja dengan baik tanpaglobal xs
.