>>> import math
>>> math.pi
3.141592653589793
>>> math.pi = 3
>>> math.pi
3
>>> import math
>>> math.pi
3
Начальный вопрос: почему я не могу получить math.pi назад?
Я думал, что import будет импортировать все определенные переменные и функции в текущую область. И если имя переменной уже существует в текущей области, то оно заменит его.
Да, он его заменяет:
>>> pi = 3
>>> from math import *
>>> pi
3.141592653589793
Тогда я подумал, что, возможно, назначение math.pi = 3 действительно изменило свойство в math class (или оно math module?), которое импортировало import math.
Я был прав:
>>> import math
>>> math.pi
3.141592653589793
>>> math.pi = 3
>>> from math import *
>>> pi
3
Итак, кажется, что:
Если вы выполняете import x, тогда он импортирует x как класс. И если вы внесете изменения в x.property, изменение будет сохраняться в модуле, чтобы каждый раз, когда вы импортируете его снова, это модифицированная версия.
Реальный вопрос:
- Почему
importреализован таким образом? Почему бы не позволить каждойimport mathимпортировать новую, немодифицированную копиюmath? Почему оставить импортированныйmathоткрытым для изменения? - Есть ли способ обхода, чтобы получить
math.piназад после выполненияmath.pi = 3(кромеmath.pi = 3.141592653589793, конечно)? - Первоначально я думал, что
import mathпредпочтительнееfrom math import *. Но это поведение меня беспокоит, что кто-то другой может изменить мой импортированный модуль, если я сделаю это таким образом... Как мне сделатьimport?