Прежде всего - вы можете сделать код более надежным, передав таблицу в качестве аргумента Names.LoadTable
.Эта функция может добавлять имена в таблицу, не создавая ее заново.Вот урезанная версия
TABLE = []
class ModifiesTables:
@classmethod
fill_table(cls, incoming_table):
# real logic would go here
for n in range(100):
incoming_table.append(n)
ModifiesTables.fill_table(TABLE)
print(TABLE)
# [0,1,2.....]
, вам, несомненно, скажут, что глобальные перемены - это плохая идея, и они есть.Однако если вы создадите таблицу вне функции - например, как я это делал выше - она будет доступна для функций , определенных в той же области действия , без дополнительной работы.Вышеприведенный пример также может выглядеть следующим образом:
TABLE = []
def fill_table():
for n in range(100):
TABLE.append(n)
Однако это работает только в той же области действия , и ваш пример выглядит так, как будто вы объявляете «глобальную» таблицу в однойфайл и класс в другом.В этом случае лучше использовать первый пример, потому что отношения понятны, а не неявны (и вам не нужно беспокоиться, если, например, вы решили переместить вещи в разные файлы).
Хотя Pythonимеет глобальное ключевое слово, оно вам понадобится только в том случае, если вы присваиваете глобальному, а не просто используете его.Так что это работает:
TABLE = []
def works():
TABLE.append("I work") #using, not assigning
но это не
def does_not_work():
TABLE = [] # this declares a local with the same name, the original is ignored
, в этом случае вам понадобится глобальное:
def works_but_use_sparingly():
global TABLE
TABLE = [] # this will replace TABLE with a new list
Официальное объяснение этого поведенияis:
В Python переменные, на которые ссылаются только внутри функции, неявно глобальны.Если переменной присваивается значение где-либо в теле функции, она считается локальной, если только она явно не объявлена как глобальная.
Хотя сначала это немного удивляет, это объясняется моментальным рассмотрением.С одной стороны, требование наличия глобальных для назначенных переменных обеспечивает защиту от непреднамеренных побочных эффектов.С другой стороны, если бы глобальный требовался для всех глобальных ссылок, вы бы использовали глобальный все время.Вы должны будете объявить как глобальную каждую ссылку на встроенную функцию или компонент импортируемого модуля.Этот беспорядок отрицает полезность глобальной декларации для определения побочных эффектов.
Многое в этом вопросе .