Небольшой вопрос о области видимости переменной Python - PullRequest
1 голос
/ 11 декабря 2008

Я новичок в 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

Ответы [ 5 ]

5 голосов
/ 11 декабря 2008

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

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

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

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


Edit. Продолжение: «так что мне делать, если я хочу использовать результат функции 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.

    б. В 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 ), y равен 3, x равен 2. Значение hi равно 3.1415926.

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

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

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

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

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

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

3 голосов
/ 11 декабря 2008

Если вы хотите определить переменную для глобального пространства имен внутри функции и, таким образом, сделать ее доступной для других функций в этом пространстве, вы можете использовать ключевое слово 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

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

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

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

2 голосов
/ 11 декабря 2008

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

Краткое описание правил области применения Python

2 голосов
/ 11 декабря 2008

ваш пример программы работает, потому что два экземпляра '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
1 голос
/ 11 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...