2016-02-11 3 views
-1

Я застрял в использовании переменных, определенных в предыдущей функции, в другой функции. Например, у меня есть этот код:Как получить доступ к переменной, определенной внутри функции, извне этой функции

def get_two_nums(): 
    ... 
    ... 
    op = ... 
    num1 = ... 
    num2 = ... 
    answer = ... 

def question(): 
    response = int(input("What is {} {} {}? ".format(num1, op, num2))) 
    if response == answer: 
     ..... 

Как использовать переменные, определенные в первой функции второй функции? Заранее спасибо

+0

Вы спрашиваете: «Как создать переменные в одной функции и получить их в другой функции?»? Или вы спрашиваете: «Как я могу оценить результат математического уравнения, где каждый компонент хранится в виде строки в отдельной переменной?»? – Kevin

+0

Возможный обман: http://stackoverflow.com/q/423379/1561176 –

ответ

3

Почему бы не вернуть кортеж?

def get_two_nums(): 
    ... 
    ... 
    op = ... 
    num1 = ... 
    num2 = ... 
    answer = ... 
    return op, num1, num2, answer 

def question(): 
    op, num1, num2, answer = get_two_nums() 
    response = int(input("What is {} {} {}? ".format(num1, op, num2))) 
    if response == answer: 
     # the rest of your logic here 
3

Переменные являются локальными для функций; вам необходимо указать return соответствующие значения, которые вы хотите передать вызывающему абоненту, и передать их следующей функции, которая их использует. Как это:

def get_two_nums(): 
    ... 
    # define the relevant variables 
    return op, n1, n2, ans 

def question(op, num1, num2, answer): 
    ... 
    # do something with the variables 

Теперь вы можете позвонить

question(*get_two_nums()) # unpack the tuple into the function parameters 

или

op, n1, n2, ans = get_two_nums() 
question(op, n1, n2, ans) 
+0

Он возвращает ошибку: 'question() missing 3 требуемых позиционных аргумента:' op ',' num2 'и' answer '' – Matt

+0

Упс, извините , вам нужно распаковать кортеж. Будет редактировать. –

2

Вы не можете просто передать их, поскольку переменные в get_two_nums определены только в рамках get_two_nums функции. Поэтому в основном у вас есть два варианта:

  1. Верните их значение кортежа в рамки другой функции, как @TimPietzcker и @ Tgsmith61591 предложил.

  2. Определение переменных в get_two_nums функции, как Глобалы (см global statement, для получения дополнительной информации), как в коде Snipper ниже:

    def get_two_nums(): 
        global num1 
        num1 = 'value1' 
        global num2 
        num2 = 'value2' 
        global num3 
        num3 = 'value3' 
    
    def question(): 
        # Call get_two_nums to set global variables for further using 
        get_two_nums() 
        response = int(input("What is {} {} {}? ".format(num1, num2, num3))) 
        if response == answer: 
         # Some code here ... 
    

ПРЕДУПРЕЖДЕНИЕ: Использование глобальных переменных следует избегать, см Why are global variables evil? в лучше понять, о чем я говорю ...

+1

Следует упомянуть, что в большинстве случаев следует избегать использования 'global'. Как только ваша программа будет увеличиваться в размерах, «глобальный» может очень затруднить отладки. –

+1

Неужели вы не выступаете за использование «глобальных»? Это ужасная практика. – AChampion

+0

Ребята, вы определенно правы, и я полностью согласен с вами, я обновил ответ с этим предупреждением. Однако использование global также дает возможность получить поведение, о котором OP спрашивает .... –

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