복붙노트

[PYTHON] 수입이있는 전역 변수

PYTHON

수입이있는 전역 변수

myGlobal = "hello"

def changeGlobal():
   myGlobal="bye"
from first import *

changeGlobal()
print myGlobal

내가 얻는 결과는

나는 그것이 있어야한다고 생각했지만

changeGlobal () 함수를 호출 한 후에 전역 변수 myGlobal이 변경되지 않는 이유는 무엇입니까?

해결법

  1. ==============================

    1.시험:

    시험:

    def changeGlobal():
        global myGlobal
        myGlobal = "bye"
    

    실제로, 그것은 작동하지 않습니다. *를 가져올 때 (변수를 변경하지 않는 한, 아래 참조) 의도 한 변경에 영향을받지 않는 새로운 로컬 모듈 global myGlobal을 만듭니다. 다음과 같이 대신 사용할 수 있습니다.

    import nice
    
    nice.changeGlobal()
    print nice.myGlobal
    

    또는:

    myGlobal = "hello"
    
    def changeGlobal():
       global myGlobal
       myGlobal="bye"
    
    changeGlobal()
    

    그러나 전역 변수가 변경 가능한 컨테이너 인 경우 이제 변경 가능 항목에 대한 참조를 보유하고 변경 사항을 확인할 수 있습니다.

    myGlobal = ["hello"]
    
    def changeGlobal():
        myGlobal[0] = "bye"
    
  2. ==============================

    2.나는 당신과 같은 관심사를 가지고 있었고 Norman Matloff의 Quick and Painless Python Tutorial에서 다음 섹션을 읽는 것이 정말 도움이되었습니다. 다음은 이해해야 할 사항입니다 (Matloff의 책에서 복사).

    나는 당신과 같은 관심사를 가지고 있었고 Norman Matloff의 Quick and Painless Python Tutorial에서 다음 섹션을 읽는 것이 정말 도움이되었습니다. 다음은 이해해야 할 사항입니다 (Matloff의 책에서 복사).

    파이썬은 C / C ++에서 전역 변수를 허용하지 않습니다. 가져온 파이썬 모듈은 모듈을 가져 오는 모듈의 전역 변수에 직접 액세스 할 수 없으며 반대의 경우도 마찬가지입니다.

    예를 들어,이 두 파일 x.py,

    # x.py
    import y
    def f():
      global x
      x = 6
    def main():
      global x
      x = 3
    f()
    y.g()
    if __name__ == ’__main__’:
      main()
    

    및 y.py :

    # y.py
    def g():
      global x
      x += 1
    

    x.py의 변수 x는 x.py 모듈 전체에서 볼 수 있지만 y.py에서는 볼 수 없습니다. 사실, 라인 실행 x + = 1

    후자의 경우 "global name 'x'이 정의되지 않은 오류 메시지가 나타납니다.

    실제로 모듈의 전역 변수는 클래스 내의 클래스 변수의 역할과 유사하게 해당 모듈의 속성 (즉, 구성원 엔터티) 일뿐입니다. 모듈 A가 모듈 B를 가져 오면 B의 네임 스페이스가 A에 복사됩니다. 모듈 B에 전역 변수 X가 있으면 모듈 A는 해당 이름의 변수를 작성합니다.이 변수의 초기 값은 가져 오기시 해당 이름의 변수에 대해 모듈 B가 갖는 값입니다. 그러나 모듈 중 하나에서 X에 대한 변경 사항은 다른 모듈에 반영되지 않습니다.

    X가 B에서 변경된다고하지만 A의 코드가 B에서 X의 최신 값을 가져올 수 있기를 바란다. B에 GetX ()라는 함수를 포함 시켜서 할 수있다. A에서 B , A는 그 이름을 가진 B의 함수의 복사본 인 GetX () 함수를 얻을 것이고, B의 함수가 변경되지 않는 한 (가능하다면, 함수가 할당 될 수있다), X의 값을 반환하는 것이 유일한 목적이다. 두 모듈의 함수는 항상 동일하므로 A는 함수를 사용하여 B에서 X 값을 가져올 수 있습니다.

  3. ==============================

    3.파이썬 전역 변수가 전역 변수가 아닙니다.

    파이썬 전역 변수가 전역 변수가 아닙니다.

    wassimans는 위에서 정의한대로 본질적으로 정의 된 모듈 (또는 정의 된 함수를 포함하는 모듈)의 범위 내에있는 속성입니다.

    사람들이 처음 겪는 혼란 (버그)은 함수에 로컬 네임 스페이스가 있다는 사실을 인식하지 못하고 함수에 변수를 설정하면 같은 함수의 (글로벌) 변수를 변경하려는 경우에도 함수의 로컬 변수가 함수의 로컬 변수가됩니다 이름을 포함하는 모듈. (이름 선언 함수의 'global'문에 넣거나 (global) 변수를 설정하기 전에 변수에 액세스하십시오.)

    두 번째 혼란 (버그)은 각 모듈 (즉, 가져온 파일)이 자체적으로 '전역'이름 공간을 포함한다는 점입니다. 나는 세계 (지구)가 모듈이라는 파이썬의 것들을 추측한다. 아마도 우리는 하나 이상의 세계에 걸쳐있는 보편적 인 변수를 찾고있을 것이다.

    (지금 이해하기 시작한) 세 번째 혼란은 __main__ 모듈의 '전역'이 어디에 있는가? 즉 대화 형 모드에서 명령 행에서 파이썬을 시작하거나 파이썬 스크립트 (명령 쉘에서 foo.py의 이름을 입력하는 경우)를 사용하면 이름을 사용할 수있는 모듈을 가져올 수 없습니다.

    'globals ()'또는 globals (). keys ()의 내용은 전역 변수의 목록을 제공합니다 : dir (sys.modules [ '__ main__']) 로드 된 파이썬 스크립트 (또는로드 된 스크립트가없는 대화 형 세션)의 모듈은 __name__에 명명 된 이름이지만 전역 이름은 없지만 시스템 목록에서 이름이 '__main__'인 모듈로 액세스 할 수 있습니다. 모든 활성 모듈, sys.modules

  4. from https://stackoverflow.com/questions/4706879/global-variable-with-imports by cc-by-sa and MIT license