2012-05-08 5 views
1

아래 예제를 통해 test.fun1()을 실행할 때 "NameError: global name 'MATRIX' is not defined" 예외를 발생시키는 원인을 파악하고 싶습니다.다른 함수에 의해 호출 된 함수에 전역 변수를 전달하는 방법

고마워요. 귀하의 MATRIX

class test: 
    MATRIX = [] 

    @staticmethod   
    def fun1(): 
     global MATRIX 
     test.fun2(MATRIX) 

    @staticmethod 
    def fun2(MATRIX): 
     MATRIX.append(2) 

test.fun1()  
print test.MATRIX 

답변

3

글로벌 아니라, 클래스 속성의이 같은 시도 : 코드에서 전역 변수라는 이름의 MATRIX이 없기 때문에

class test: 
    MATRIX = [] 

    @classmethod  # Note classmethod, not staticmethod 
    def fun1(cls): # cls will be test here 
     test.fun2(cls.MATRIX) 

    @staticmethod 
    def fun2(MATRIX): 
     MATRIX.append(2) 

test.fun1()  
print test.MATRIX 
+0

답장을 보내 주셔서 감사합니다. 실제 전역 변수가 무엇인지 이해하는 데 도움이되었습니다. – j5shi

2

오류 "NameError: global name 'MATRIX' is not defined"가 발생합니다.

코드 에서 MATRIX은 글로벌 변수가 아니며 클래스 속성입니다. 전역 변수는 다음과 같이 사용됩니다.

MATRIX = [] 

class test: 

    @staticmethod 
    def fun1(): 
     test.fun2(MATRIX) 

    @staticmethod 
    def fun2(l): 
     l.append(2) 

    @staticmethod 
    def reset(): 
     global MATRIX 
     MATRIX = [] 

test.fun1() 
print MATRIX 
# >>> [2] 
test.fun1() 
print MATRIX 
# >>> [2, 2] 
test.reset() 
print MATRIX 
# >>> [] 
+0

이것은 질문의 제목이 묻는 것을 달성하지 못합니다. 그는 다른 함수에 의해 호출 된 함수에 전역 변수를 전달하려고 할 때 전역 선언을 호출 된 함수로 옮겼습니다. – jamylak

+0

@mooddha 귀하의 의견에 감사드립니다, 그것은 도움이됩니다. – j5shi

+0

@jamylak 감사합니다. – PabloRosales

관련 문제