2008-12-10 4 views
1

Я начинаю питон и задаюсь вопросом, очень запутанным для меня. Если я определяю функцию сначала, но внутри функции, я должен использовать переменную, которая определена в другой функции ниже, могу ли я сделать это так? Или как я могу импортировать возвращаемые вещи другой функции в функцию? , например:Небольшой вопрос о области переменных python

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return good 
+0

Ваш вопрос не совсем ясно для меня. Как связаны два метода? Они принадлежат к одному классу? – 2008-12-10 22:23:25

+0

Да, они в одном классе, только функция кулака должна получить результат от второй функции, чтобы что-то сделать. – NONEenglisher 2008-12-10 22:28:13

ответ

5

Объем функций hello и hi совершенно различны. У них нет общих переменных.

Обратите внимание, что результатом вызова hi(x,y) является некоторый объект. Вы сохраняете этот объект с именем good в функции hello.

Переменная с именем good в hello является другой переменной, не связанной с переменной с именем good в функции hi.

Они написаны одинаково, но существуют в разных пространствах имен. Чтобы доказать это, измените написание переменной good в одной из двух функций, вы увидите, что все еще работает.


Редактировать. Последующее наблюдение: «так что мне делать, если я хочу использовать результат функции hi в функции hello

Ничего необычного. Посмотрите на hello близко.

def hello(x,y): 
    fordf150 = hi(y,x) 
    "then do somethings,and use the variable 'fordf150'." 
    return something 

def hi(ix, iy): 
    "compute some value, good." 
    return good 

Сценарий оценивается hello(2, 3).

  1. Python создает новое пространство имен для оценки hello.

  2. В hello, x привязан к объекту 2. Связывание выполняется по порядку.

  3. В hello, y привязан к объекту 3.

  4. В hello, Python оценивает первое утверждение, fordf150 = hi(y, x), y 3, x является 2.

    а. Python создает новое пространство имен для оценки hi.

    b. В hi, ix привязан к объекту 3. Связывание выполняется по порядку.

    c. В hi, iy привязан к объекту 2.

    d. В hi что-то происходит, и good привязан к какому-то объекту, скажем 3.1415926.

    e. В hi исполняется return; идентифицируя объект как значение для hi. В этом случае объект называется good и является объектом 3.1415926.

    f. Пространство имен hi отбрасывается. good, ix и iy исчезли. Объект (3.1415926), однако, остается в качестве значения для оценки hi.

  5. В hello, Python завершает первое утверждение, fordf150 = hi(y, x), y 3, x равно 2. Значение hi является 3.1415926.

    a. fordf150 привязан к объекту, созданному путем оценки hi, 3.1415926.

  6. В hello, Python переходит к другим операторам.

  7. В какой-то момент something привязан к объекту, скажем, 2.718281828459045.

  8. hello, a return; идентифицируя объект как значение для hello. В этом случае объект имеет имя something и является объектом 2.718281828459045.

  9. Пространство имен отбрасывается. fordf150 и something исчезают, как и x и y. Объект (2.718281828459045), однако, остается в качестве значения для оценки hello.

Любая программа или сценарий под названием hello получает ответ.

2

ваш пример работает программа, так как два экземпляра «хорошо» разные переменные (вы просто так, чтобы обе переменные с тем же именем). Следующий код является точно такой же:

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return great 
1

Функция «привет» не имеет против вас вызова функции «привет», которая еще не определена, если вы не пытаетесь фактически использовать функцию «привет» до тех пор, пока обе функции не будут определены.

3

Если вы хотите определить переменную в глобальном пространстве имен изнутри функции и тем самым сделать ее доступной другими функциями в этом пространстве, вы можете использовать глобальное ключевое слово. Вот несколько примеров:

varA = 5 #A normal declaration of an integer in the main "global" namespace 

def funcA(): 
    print varA #This works, because the variable was defined in the global namespace 
       #and functions have read access to this. 
def changeA(): 
    varA = 2 #This however, defines a variable in the function's own namespace 
       #Because of this, it's not accessible by other functions. 
       #It has also replaced the global variable, though only inside this function 
def newVar(): 
    global varB #By using the global keyword, you assign this variable to the global namespace 
    varB = 5 

def funcB(): 
    print varB #Making it accessible to other functions 

Заключение: переменные, определенные в функции, остаются в пространстве имен функций. Он по-прежнему имеет доступ к глобальному пространству имен только для чтения, если только переменная не была вызвана с ключевым словом global.

Термин глобальный не является полностью глобальным, как может показаться на первый взгляд. Это практически только ссылка на наименьшее пространство имен в файле, в котором вы работаете. Глобальные ключевые слова недоступны в другом модуле.

В качестве мягкого предупреждения это может считаться менее «хорошей практикой» некоторых.

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