Определение списков как глобальных переменных в Python
Я использую список, в котором некоторые функции работают в моей программе. Это общий список, и все мои функции могут его редактировать. Действительно ли необходимо определить его как "глобальное" во всех функциях?
Я имею в виду, что поместить ключевое слово global в каждую используемую им функцию или определить ее вне всех функций достаточно, не используя глобальное слово, лежащее за его определением?
Ответы
Ответ 1
Когда вы назначаете переменную (x = ...
), вы создаете переменную в текущей области (например, локальную для текущей функции). Если это происходит, чтобы затенять переменную fron на внешнюю (например, глобальную) область, тоже слишком плохо - Python не заботится (и это хорошо). Поэтому вы не можете этого сделать:
x = 0
def f():
x = 1
f()
print x #=>0
и ожидаем 1
. Вместо этого вам нужно объявить, что вы намерены использовать global x
:
x = 0
def f():
global x
x = 1
f()
print x #=>1
Но обратите внимание, что назначение переменной сильно отличается от вызова метода. Вы всегда можете вызывать методы во всех областях - например. на переменные, которые поступают из внешней (например, глобальной) области видимости, потому что ничто локально не теневое их.
Также очень важно: назначение членов (x.name = ...
), назначение элемента (collection[key] = ...
), назначение фрагментов (sliceable[start:end] = ...
) и, возможно, больше - все вызовы методов! И поэтому вам не нужно global
изменять глобальные члены или вызывать его методы (даже если они мутируют объект).
Ответ 2
Да, вам нужно использовать global foo
, если вы собираетесь писать на него.
foo = []
def bar():
global foo
...
foo = [1]
Ответ 3
Нет, вы можете указать список как аргумент ключевого слова для вашей функции.
alist = []
def fn(alist=alist):
alist.append(1)
fn()
print alist # [1]
Я бы сказал, что это плохая практика. Вид слишком хакерский. Если вам действительно нужно использовать глобально доступную одноэлементную структуру данных, я бы использовал переменный уровень уровня модуля, т.е.
поместите 'alist' в модуль, а затем в ваши другие модули импортируйте эту переменную:
В файле foomodule.py:
alist = []
В файле barmodule.py:
import foomodule
def fn():
foomodule.alist.append(1)
print foomodule.alist # [1]