2013-08-20 3 views
1

내 코드입니다 :파이썬 모듈 변수 혼란 여기

모듈 settings.py :

My_KEY = "" 

내가 다른 모듈

my_module.py

from settings import My_KEY 


def function_a(): 
    MY_KEY = "abcd" 


def function_b(): 
    function_a(); 
    print My_KEY 
이 MY_KEY을 사용하고 있습니다

function_b()를 호출하면 "abcd"가 출력 될 것으로 예상되지만 빈 문자열은 어떻게 생깁니 까? 완전히 손실되었습니다

+0

명시 적으로 직접 수행하는 것이 명확하고 더 명시의 모듈 수준 변수를 변경하려면 : 가져 오기 설정 그런 다음 settings.MY_KEY = 'abcd'를 사용하면 변수를 변경하려고합니다. BTW는 변경하지 않는 상수에 ALL_CAPS를 사용하는 것이 관례입니다. 따라서 여기서는 두 가지로 혼란 스럽습니다. – theodox

답변

6

기본적으로 함수 내에 대입 문이 있으면 Python은 왼쪽 변수를 지역 변수로 사용합니다.

당신이 함수 내에서 전역 변수를 수정하려면

는 글로벌로 변수를 선언 할 global statement를 사용

def function_a(): 
    global My_KEY 
    My_KEY = "abcd" 

그러나, 함수 내에서 전역을 수정하지 않도록하는 것이 좋습니다. 장기적으로 코드를 이해하기 어렵게 만듭니다. 대신 function_a에서 반환 값으로 My_KEY을 전달할 수 :

def function_a(): 
    My_KEY = "abcd" 
    return My_KEY 

def function_b(): 
    My_KEY = function_a() 
    print My_KEY 
3

그것은 모든 파이썬 scoping and namespacing에 관하여이다. function_a

  • My_KEY 수입

    • 전역 변수 My_KEY (나는 당신이 거기에 오타가 있다고 생각 : My_KEY 대신 MY_KEY해야한다) function_b
    • My_KEY

      당신은 실제로 My_KEY의 3 개 버전이

    수정하기 위해 global 같은 함수 내에서 변수를 표시 할 수 있습니다

    def function_a(): 
        global My_KEY 
        My_KEY = "abcd" 
    
  • 0

    범위 지정 문제의 일부입니다하지만 당신은 또한 당신이 변수를 가져 오는 방법에 대해주의 할 필요가있다. from settings import My_KEY은 원래 문자열을 가리키는 로컬 모듈의 네임 스페이스에 새 변수를 만듭니다. 모듈의 My_KEY에 다른 문자열을 할당하면 설정 모듈의 My_KEY에 영향을주지 않습니다. 가변 객체를 수정할 때 문제가 아니지만 값을 재 지정할 때마다 모듈 자체를 모듈로 가져오고 변수의 점으로 구분 된 이름을 사용하는 것이 좋습니다.

    settings.py :

    My_KEY = "" 
    

    다음 셸에서 빠른 테스트

    >>> from settings import My_KEY 
    >>> def function_a(): 
    ...  global My_KEY 
    ...  My_KEY="abcd" 
    ... 
    >>> My_KEY 
    '' 
    >>> function_a() 
    >>> My_KEY 
    'abcd' 
    >>> 
    >>> # here's where it gets funky... the original settings.My_KEY didn't change 
    >>> 
    >>> import settings 
    >>> settings.My_KEY 
    '' 
    >>>