Подтвердить что ты не робот

Как сделать локальную переменную (внутри функции) глобальной

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

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

4b9b3361

Ответ 1

Вот два способа достижения одного и того же:

Использование параметров и возврат (рекомендуется)

def other_function(parameter):
    return parameter + 5

def main_function():
    x = 10
    print x    
    x = other_function(x)
    print x

Когда вы запустите main_function, вы получите следующий вывод

>>> 10
>>> 15

Использование глобальных переменных (никогда не делайте этого)

x = 0   # The initial value of x, with global scope

def other_function():
    global x
    x = x + 5

def main_function():
    print x    # Just printing - no need to declare global yet
    global x   # So we can change the global x
    x = 10
    print x
    other_function()
    print x

Теперь вы получите:

>>> 0    # Initial global value
>>> 10   # Now we've set it to 10 in `main_function()`
>>> 15   # Now we've added 5 in `other_function()`

Ответ 2

Просто объявляйте переменную вне любой функции:

globalValue = 1

def f(x):
    print(globalValue + x)

Если вам нужно назначить глобальное значение внутри функции, используйте оператор global:

def f(x):
    global globalValue
    print(globalValue + x)
    globalValue += 1

Ответ 3

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

class StatefulFunction( object ):
    def __init__( self ):
        self.public_value = 'foo'

    def __call__( self ):
        return self.public_value


>> f = StatefulFunction()
>> f()
`foo`
>> f.public_value = 'bar'
>> f()
`bar`

Ответ 4

Использование globals также сделает вашу программу беспорядочной - я предлагаю вам очень стараться избегать их. Тем не менее, "global" является ключевым словом в python, поэтому вы можете назначить определенную переменную как глобальную, например:

def foo():
    global bar
    bar = 32

Я должен упомянуть, что ключевое слово "global" крайне редко используется, поэтому я серьезно предлагаю переосмыслить ваш дизайн.

Ответ 5

Вы можете использовать область модуля. Скажем, у вас есть модуль под названием utils:

f_value = 'foo'

def f():
    return f_value

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

>> import utils
>> utils.f()
'foo'
>> utils.f_value = 'bar'
>> utils.f()
'bar'

Обратите внимание, что вы можете импортировать функцию по имени:

>> import utils
>> from utils import f
>> utils.f_value = 'bar'
>> f()
'bar'

Но не атрибут:

>> from utils import f, f_value
>> f_value = 'bar'
>> f()
'foo'

Это связано с тем, что вы помечаете объект, на который ссылается атрибут модуля, как f_value в локальной области, но затем привязываете его к строке bar, тогда как функция f все еще относится к атрибуту модуля.