Определение списков как глобальных переменных в 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]