Небольшой вопрос о области видимости переменной Python

Я новичок в 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
10.12.2008 22:20:07
Ваш вопрос мне не совсем понятен. Как связаны два метода? Они принадлежат к одному классу?
Joachim Sauer 10.12.2008 22:23:25
да, они в одном классе, просто функция fist нуждается в результате из второй функции, чтобы что-то сделать.
NONEenglisher 10.12.2008 22:28:13
Я действительно не понимаю проблемы с этим, вы просто назначаете возвращаемые значения вызова функции переменной внутри метода, как в любом другом случае.
Lucas S. 10.12.2008 22:35:12
Я думаю, что спрашивающий неправильно понимает проблему, которую они имеют. Если бы вы могли показать реальный код и то, что вы хотите сделать, мы сможем помочь вам лучше.
Harley Holcombe 10.12.2008 22:36:44
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Питон оценивает первое утверждение, fordf150 = hi( y, x ), y3, x2.

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

    б. В hi, ixсвязан с объектом 3. Привязка производится в положении заказа.

    с. В hi, iyсвязан с объектом 2.

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

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

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

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

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

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

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

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

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

Какая бы программа или скрипт ни назывался, helloполучает ответ.

5
11.12.2008 02:02:37
значит ли это, что две функции полностью имеют отношения? так что мне делать, если я хочу использовать результат функции hi в функции hello?
NONEenglisher 10.12.2008 22:56:38
Есть термин для ситуации, когда «привет» называет «привет», а «привет» называет «привет». Мы называем это рекурсией. Более простой случай - когда функция может вызывать себя сама. Обычно это не считается темой для начинающих, но если вы запустите поиск по рекурсии, вы найдете много информации. Добро пожаловать в программирование.
Jeffrey Martinez 10.12.2008 23:56:08

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

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
2
10.12.2008 22:35:55

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

1
10.12.2008 22:37:05

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

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

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

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

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

3
10.12.2008 23:35:45

Более подробную информацию о правилах Python можно найти здесь:

Краткое описание Python Scoping Rules

2
23.05.2017 12:19:01