Глобальная переменная с импортом

Мне удается создать цвета интуитивно теперь (с некоторым методом проб и ошибок, конечно), практикуя их много. Игра/использование цветных микшеров (с красными/зелеными/синими ползунками, например) помогает в понимании отношений. Теперь, я знаю, что FFFF00 является желтым, FF00FF является пурпурным, 00FFFF является голубым плюс, конечно, основные цвета, и все цвета других являются промежуточными.

26
задан serv-inc 19 October 2018 в 10:31
поделиться

1 ответ

У меня однажды была такая же проблема, как и у вас, и чтение следующего раздела из Быстрого и безболезненного урока Python Нормана Мэтлоффа было действительно хорошей помощью. Вот что вам нужно понять (скопировано из книги Матлоффа):

Python не допускает глобальных переменных в том смысле, в каком это делает C / C ++. Импортированный модуль Python не будет иметь прямого доступа к глобальным переменным в модуле, который его импортирует, и наоборот.

Например, рассмотрим эти два файла: x.py ,

# x.py
import y
def f():
  global x
  x = 6
def main():
  global x
  x = 3
f()
y.g()
if __name__ == ’__main__’:
  main()

и y.py :

# y.py
def g():
  global x
  x += 1

Переменная x в x.py видна по всему модулю x.py , но не в y.py . Фактически, выполнение строки x + = 1

в последнем приведет к появлению сообщения об ошибке: «глобальное имя« x »не определено».

Действительно, глобальная переменная в модуле это просто атрибут (т. е. элемент-член) этого модуля, аналогичный роли переменной класса в классе. Когда модуль B импортируется модулем A , пространство имен B копируется в A . Если модуль B имеет глобальную переменную X, то модуль A создаст переменную с таким именем, начальное значение которой равно модулю B для его переменной это имя во время импорта. Но изменения X в одном из модулей НЕ будут отражены в другом.

Скажем, X изменяется в B , но мы хотим, чтобы код в A мог получить самое последнее значение X в B . Мы можем сделать это, включив функцию, скажем, с именем GetX () в B . Предполагая, что A импортировал все из B , тогда A получит функцию GetX () , которая является копией B Функция с таким именем и единственная цель которой - возвращать значение X. Если B не изменяет эту функцию (что возможно, например, функции могут быть назначены), функции в двух модули всегда будут одинаковыми, и, таким образом, A может использовать свою функцию для получения значения X в B .

7
ответ дан 28 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: