Глобальные переменные и модули (простой пример справки) Python - PullRequest
2 голосов
/ 06 декабря 2011

ОК, я делаю некоторые потоки, и я думаю, что когда я начал делать потоки, я предположил, что вы не можете возвращать значения, такие как определение (это конец дня, и мой мозг вот-вот умрет, так что, возможно, это неправильно, и я должен начать возвращаться, чтобы избавиться от глобальных переменных)

В любом случае, у меня есть тестовая программа, чтобы понять, почему я не могу модульно кодировать мой код

файл с именем config.py

a_variable=0

файл с именем test_for_sean.py

from config import *
def blah():
  global a_variable
  a_variable=14
  return 0

файл с именем main.py

from config import *
from test_for_sean import *
print a_variable #this prints correctly
blah()
print a_variable #this is still printing 0....

кто-то связывает меня с чем-то, чтобы я не убивал себя

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011

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

Чтобы на самом деле делить переменные между модулями, вам нужно получить доступ к переменной через ее модуль:

файл с именем config.py

a_variable=0

файл с именем test_for_sean.py

import config
def blah():
  config.a_variable=14
  return 0

файл с именем main.py

import config
from test_for_sean import blah
print config.a_variable # prints 0
blah()
print config.a_variable # prints 14
4 голосов
/ 06 декабря 2011

Попробуйте эти изменения,

config.py,

a_variable = 0

tfs.py (был test_for_sean),

import config

def blah():
    config.a_variable = 14
    return 0

main.py,

import tfs, config

print config.a_variable
tfs.blah()
print config.a_variable

Мы все еще импортируем все из конфигурации, но «глобальные» переменные остаются в своих собственных модулях.Таким образом, мы можем иметь глобальные переменные, но все же позволить main.py определять свой собственный a_variable, если это необходимо.

2 голосов
/ 28 сентября 2015

Есть аналогия с файловой системой. Это не идеальная аналогия, но помогает быстро понять проблему.

Модули похожи на каталоги, содержащие файлы, и эти файлы представляют переменные и другие объекты. В модулях вы используете относительные пути. Просто запишите абсолютные пути, и картина станет ясной.

Ваша отправная точка:

/my_app/module1/
/my_app/module1/a_variable
/my_app/module2/

A. Если вы сделаете это в module2:

import a_variable from module1

Вы делаете копию переменной a_variable:

/my_app/module1/
/my_app/module1/a_variable
/my_app/module2/
/my_app/module2/a_variable

В этом случае, когда переменные не являются изменяемыми, они не синхронизируются при первой модификации.

B. Но когда вы делаете это вместо:

import module1

Вы создаете копию пути, ведущего к переменной: module1.a_variable

/my_app/module1/
/my_app/module1/a_variable
/my_app/module2/
/my_app/module2/module1 -> ../module1

Результат - одна и та же переменная в обоих модулях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...