2015-10-28 4 views
4

Я пытаюсь использовать переменную/список в функции, которая определена в другой функции, не делая ее глобальной.Вызов переменной в другой функции без использования глобальной

Вот мой код:

def hi(): 
    hello = [1,2,3] 
    print("hello") 

def bye(hello): 
    print(hello) 

hi() 
bye(hello) 

На данный момент я получаю ошибку, что «привет» в «до свидания (привет)» не определен.

Как я могу это решить?

+0

как он говорит, 'hello' - это имя (переменная чтения), локальное для функции' hi'. Лучший способ, из того, что я вижу, - назначить 'hello' в глобальном пространстве (т. Е. Вы вызываете функции) и передать такую ​​переменную как параметр для функций. Или, как предложено ниже, давайте 'hi' return' hello' – Pynchia

+0

, вы не можете решить эту проблему, локальная переменная в функцию не может быть видна в другом: это все интерес к локальным переменным! –

+0

Я считаю, что это проблема [XY] (http://xyproblem.info/), поскольку то, что вы пытаетесь, не соответствует какой-либо хорошей практике. Чего вы пытаетесь достичь? В чем причина желания выполнять такое нечетное кодирование? – Pynchia

ответ

3

Если вы не хотите использовать глобальную переменную, лучшим вариантом является только позвонить bye(hello) с hi().

def hi(): 
    hello = [1,2,3] 
    print("hello") 
    bye(hello) 

def bye(hello): 
    print(hello) 

hi() 
+0

Спасибо! Это похоже на лучший способ для меня сделать это. Код в вопросе был примером кода, который я составил. Я попробовал реализовать свою идею в своем основном коде, но я получаю ту же ошибку для других переменных в функции «bye» (не вызывается в моем правильном коде). Как я могу это решить? @QuakeCore – Humvee202

+0

Вы можете попробовать отправить эту другую переменную в качестве аргумента вместе с 'hello' или еще лучше [использовать классы] (https://docs.python.org/2/tutorial/classes.html). – QuakeCore

+0

Работал, спасибо! – Humvee202

3

Необходимо вернуть привет от вашего метода hi.

Просто печатью вы не можете получить доступ к тому, что происходит внутри метода hi. Переменные, созданные внутри метода, остаются в рамках этого метода.

Информация о области видимости переменных в Python:

http://gettingstartedwithpython.blogspot.ca/2012/05/variable-scope.html

Вы возвращаетесь hello внутри метода hi, затем, когда вы звоните hi, вы должны сохранить результат в переменной.

Так, в hi, вы возвращаетесь:

def hi(): 
    hello = [1,2,3] 
    return hello 

Тогда при вызове метода, вы сохраните результат в hi в переменной:

hi_result = hi() 

Затем вы передаете эту переменную ваш bye метод:

bye(hi_result) 
+0

Спасибо! Я пытался это сделать, но я не мог вспомнить, как это сделать. Ваш ответ, безусловно, помог: P – Humvee202

2

Вы не можете объявить глобус аль переменные внутри функции без global .Вы можете сделать это

def hi(): 
    hello = [1,2,3] 
    print("hello") 
    return hello 

def bye(hello): 
    print(hello) 

hi() 
bye(hi()) 
+0

Спасибо - очень полезно! – Humvee202

0

Как уже сказал, это звучит, как вы пытаетесь решить что-то, что было бы лучше сделать по-другому (см XY problem )

Если привет и пока вам нужны разные типы данных, вам может быть лучше использовать класс.Пример:

class MyGreetings(object): 
    hello = [1, 2, 3] 

    def hi(self): 
     print('hello') 

    def bye(self): 
     print(self.hello) 

Вы также можете сделать это с глобалов:

global hello 

def hi(): 
    global hello 
    hello = [1,2,3] 
    print("hello") 

def bye(): 
    print(hello) 

или при наличии привет возвращают значение:

def hi(): 
    hello = [1,2,3] 
    print("hello") 
    return hello 

def bye(): 
    hello = hi() 
    print(hello) 

или вы могли бы привет поместить привет на функцию привет само по себе:

def hi(): 
    hello = [1,2,3] 
    print("hello") 
    hi.hello = hello 


def bye(): 
    hello = hi.hello 
    print(hello) 

Теперь, когда s помощь, беглый способ сделать то, что вы просите бы вытащить исходный код привет(), и выполнить тело функции в пределах до свидания(), а затем вытащить переменную поздоровался:

import inspect 
from textwrap import dedent 


def hi(): 
    hello = [1,2,3] 
    print("hello") 

def bye(): 
    sourcelines = inspect.getsourcelines(hi)[0] 
    my_locals = {} 
    exec(dedent(''.join(sourcelines[1:])), globals(), my_locals) 
    hello = my_locals['hello'] 
    print(hello) 
Смежные вопросы