Изменение переменной в модуле, импортированном из ... import * - PullRequest
10 голосов
/ 21 января 2011

Рассмотрим следующий код:

#main.py
From toolsmodule import *
database = "foo"

#toolsmodule
database = "mydatabase"

Как представляется, в каждом модуле создается одна переменная с различным содержимым.Как я могу изменить переменную внутри toolsmodule из main?Не работает следующее:

toolsmodule.database = "foo"

Ответы [ 3 ]

16 голосов
/ 21 января 2011

Звучит как еще одна из множества веских причин не использовать from toolsmodule import *.

Если вы просто делаете import toolsmodule, тогда вы можете сделать toolsmodule.database = 'foo', и все замечательно.

6 голосов
/ 22 января 2011

Имена переменных Pythons - это просто метки переменных. Когда вы import *, все эти метки являются локальными, и когда вы затем устанавливаете базу данных, вы просто заменяете локальную переменную, а не ту, которая находится в toolsmodule. Следовательно, сделайте это:

toolsmodule.py:

database = "original"

def printdatabase():
   print "Database is", database

А затем запустите:

import toolsmodule
toolsmodule.database = "newdatabase"
toolsmodule.printdatabase()

Выход

Database is newdatabase

Обратите внимание, что если вы затем из ДРУГОГО модуля также сделали import *, изменение не отражается.

Короче говоря: НИКОГДА не используйте from x import *. Я не знаю, почему все новички продолжают делать это, несмотря на всю документацию, о которой я знаю, что это плохая идея.

2 голосов
/ 21 января 2011

Почему бы вам не сделать это так:

import toolsmodule
toolsmodule.database = "foo"
from toolsmodule import *  #bad idea, but let's say you have to..
print database #outputs foo
...