2012-05-08 2 views
1

Приведенный ниже пример, я хочу выяснить, что вызывает исключение "NameError: global name 'MATRIX' is not defined" при выполнении test.fun1().Как передать глобальную переменную функции, которая вызывается другой функцией

Большое спасибо.

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 не является глобальной переменной, а атрибутом класса. Глобальная переменная будет использоваться примерно так:

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

Смежные вопросы