1) Первое утверждение совершенно неверно. from ... import присваивает имени в текущем контексте значение аналогичного имени в другом контексте. То есть в определенном смысле создает новую переменную.
A.py:
g1 = 1
B.py:
import A
from A import g1
A.g1 = 2
print g1, A.g1
python B.py:
1 2
В этом контексте нет никакой разницы между "from A import g1" и "g1 = A.g1". Что я тебе собственно и пытаюсь объяснить.
2) Второе утверждение правильно. Более того, "import" в блоке тоже создает локальные переменные:
A.py:
g1 = 1
B.py:
def f():
from A import g1
print "in f, g1 =", g1
f()
print "outside of f, g1 = ", g1
python B.py:
in f, g1 = 1
outside of f, g1 =
Traceback (most recent call last):
File "B.py", line 6, in ?
print "outside of f, g1 = ", g1
NameError: name 'g1' is not defined
no subject
Date: 2006-08-28 12:53 am (UTC)1) Первое утверждение совершенно неверно. from ... import присваивает имени в текущем контексте значение аналогичного имени в другом контексте. То есть в определенном смысле создает новую переменную.
A.py: g1 = 1 B.py: import A from A import g1 A.g1 = 2 print g1, A.g1 python B.py: 1 2В этом контексте нет никакой разницы между "from A import g1" и "g1 = A.g1". Что я тебе собственно и пытаюсь объяснить.
2) Второе утверждение правильно. Более того, "import" в блоке тоже создает локальные переменные:
A.py: g1 = 1 B.py: def f(): from A import g1 print "in f, g1 =", g1 f() print "outside of f, g1 = ", g1 python B.py: in f, g1 = 1 outside of f, g1 = Traceback (most recent call last): File "B.py", line 6, in ? print "outside of f, g1 = ", g1 NameError: name 'g1' is not definedОпять же, это все очень хорошо описано в 4.1 Naming and binding и PEP 227 - Statically Nested Scopes.
Поэтому вопрос к тебе: в чем собственно состоит "клиническая дурость" видимости имен в Питоне (если прочитать документацию)?