Saya agak bingung tentang bagaimana variabel global bekerja. Saya punya proyek besar, dengan sekitar 50 file, dan saya perlu mendefinisikan variabel global untuk semua file itu.
Apa yang saya lakukan adalah mendefinisikannya dalam main.py
file proyek saya , sebagai berikut:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Saya mencoba untuk menggunakan myList
di subfile.py
, sebagai berikut
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Cara lain saya mencoba, tetapi tidak berhasil juga
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
Dan di dalam subfile.py
saya punya ini:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Tetapi sekali lagi, itu tidak berhasil. Bagaimana saya harus menerapkan ini? Saya mengerti bahwa itu tidak bisa berfungsi seperti itu, ketika dua file tidak benar-benar mengenal satu sama lain (well subfile tidak tahu utama), tapi saya tidak bisa memikirkan bagaimana melakukannya, tanpa menggunakan io tulisan atau acar, yang Saya tidak ingin melakukannya.
NameError: name 'myList' is not defined
darimain.py
lineprint(globfile.myList[0])
Jawaban:
Masalahnya Anda tetapkan
myList
dari manamain.py
, tetapisubfile.py
perlu menggunakannya. Ini adalah cara bersih untuk menyelesaikan masalah ini: pindahkan semua global ke sebuah file, saya sebut file inisettings.py
. File ini bertanggung jawab untuk mendefinisikan global dan menginisialisasi mereka:Selanjutnya, Anda
subfile
dapat mengimpor global:Catatan yang
subfile
tidak memanggilinit()
- tugas itu milikmain.py
:Dengan cara ini, Anda mencapai tujuan Anda sambil menghindari menginisialisasi variabel global lebih dari sekali.
sumber
init()
. Modul hanya dievaluasi saat pertama kali diimpor, jadi sangat baik untuk menginisialisasi variabel-variabel tersebut di dalam tubuh modul.Lihat dokumen Python tentang berbagi variabel global di seluruh modul :
sumber
x
menggunakanfrom config import x
, hanya menggunakanimport config
Anda dapat menganggap variabel global Python sebagai variabel "modul" - dan karenanya mereka jauh lebih berguna daripada "variabel global" tradisional dari C.
Variabel global sebenarnya didefinisikan dalam modul
__dict__
dan dapat diakses dari luar modul sebagai atribut modul.Jadi, dalam contoh Anda:
Dan:
sumber
Penggunaan
from your_file import *
harus memperbaiki masalah Anda. Ini mendefinisikan semuanya sehingga tersedia secara global (dengan pengecualian variabel lokal dalam impor tentu saja).sebagai contoh:
dan:
sumber
import *
dengan cara apa pun sehingga referensi bersifat eksplisit (dan tidak membingungkan), Selain itu, kapan Anda pernah menggunakan semua*
referensi " " dalam modul apa saja?Jawaban Hai Vu bekerja dengan baik, hanya satu komentar:
Jika Anda menggunakan global dalam modul lain dan Anda ingin mengatur global secara dinamis, perhatikan untuk mengimpor modul lain setelah Anda mengatur variabel global, misalnya:
sumber
Upaya ke-2 Anda akan bekerja dengan sempurna, dan sebenarnya cara yang sangat baik untuk menangani nama variabel yang ingin Anda miliki secara global. Tetapi Anda memiliki kesalahan nama di baris terakhir. Beginilah seharusnya:
Lihat baris terakhir? myList adalah attr dari globfile, bukan subfile. Ini akan berfungsi seperti yang Anda inginkan.
Mike
sumber