전역 변수가 어떻게 작동하는지 혼란 스럽습니다. 약 50 개의 파일이있는 큰 프로젝트가 있으며 모든 파일에 대해 전역 변수를 정의해야합니다.
내가 한 것은 프로젝트 main.py
파일에서 다음과 같이 정의했습니다 .
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
다음과 같이 myList
에서 사용하려고합니다.subfile.py
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
다른 방법으로 시도했지만 작동하지 않았습니다.
# ../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])
그리고 subfile.py
나는 이것을 가지고 있었다 :
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
그러나 다시 작동하지 않았습니다. 이것을 어떻게 구현해야합니까? 두 파일이 실제로 서로를 알지 못하면 (하위 서브 파일은 주를 알지 못하지만) io writing 또는 pickle을 사용하지 않고 어떻게 해야할지 생각할 수 없습니다. 하고 싶지 않아요
답변
문제는 myList
에서 정의 main.py
했지만 subfile.py
사용해야합니다. 이 문제를 해결하는 확실한 방법은 다음과 같습니다. 모든 전역을 파일로 이동합니다 settings.py
. 이 파일을 호출합니다 . 이 파일은 전역을 정의하고 초기화하는 역할을합니다.
# settings.py
def init():
global myList
myList = []
다음으로 subfile
전역을 가져올 수 있습니다.
# subfile.py
import settings
def stuff():
settings.myList.append('hey')
참고 subfile
호출하지 않습니다 init()
– 작업에 속한다는 것을 main.py
:
# main.py
import settings
import subfile
settings.init() # Call only once
subfile.stuff() # Do stuff with global var
print settings.myList[0] # Check the result
이렇게하면 전역 변수를 두 번 이상 초기화하지 않으면 서 목표를 달성 할 수 있습니다.
답변
모듈 간 전역 변수 공유 에 대한 Python의 문서를 참조하십시오 .
단일 프로그램 내에서 모듈간에 정보를 공유 할 수있는 일반적인 방법은 특수 모듈 (종종 config 또는 cfg)을 작성하는 것입니다.
config.py :
x = 0 # Default value of the 'x' configuration setting
응용 프로그램의 모든 모듈에서 구성 모듈을 가져 오십시오. 그러면 모듈이 전역 이름으로 사용 가능해집니다.
main.py :
import config print (config.x)
또는
from config import x print (x)
일반적으로 modulename import * 에서 사용하지 마십시오 . 그렇게하면 수입자의 네임 스페이스가 어수선 해져서 린터가 정의되지 않은 이름을 감지하기가 훨씬 어려워집니다.
답변
파이썬 전역 변수를 “모듈”변수라고 생각하면 C의 전통적인 “전역 변수”보다 훨씬 유용합니다.
전역 변수는 실제로 모듈에 정의되며 해당 모듈 __dict__
외부에서 모듈 속성으로 액세스 할 수 있습니다.
따라서 귀하의 예에서 :
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
과:
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
# You have to make the module main available for the
# code here.
# Placing the import inside the function body will
# usually avoid import cycles -
# unless you happen to call this function from
# either main or subfile's body (i.e. not from inside a function or method)
import main
main.mylist.append("hey")
답변
를 사용 from your_file import *
하면 문제가 해결됩니다. 가져 오기에서 로컬 변수를 제외하고 전 세계에서 사용할 수 있도록 모든 것을 정의합니다.
예를 들면 다음과 같습니다.
##test.py:
from pytest import *
print hello_world
과:
##pytest.py
hello_world="hello world!"
답변
Hai Vu 답변은 한 가지 의견만으로도 효과적입니다.
다른 모듈에서 전역을 사용하고 전역을 동적으로 설정하려는 경우 전역 변수를 설정 한 후 다른 모듈을 가져 오려면 다음과 같이주의하십시오.
# settings.py
def init(arg):
global myList
myList = []
mylist.append(arg)
# subfile.py
import settings
def print():
settings.myList[0]
# main.py
import settings
settings.init("1st") # global init before used in other imported modules
# Or else they will be undefined
import subfile
subfile.print() # global usage
답변
두 번째 시도는 완벽하게 작동하며 실제로 전역에서 사용할 수있는 변수 이름을 처리하는 정말 좋은 방법입니다. 그러나 마지막 줄에 이름 오류가 있습니다. 방법은 다음과 같습니다.
# ../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])
마지막 줄을 보시겠습니까? myList는 서브 파일이 아닌 globfile의 속성입니다. 이것은 당신이 원하는대로 작동합니다.
마이크