>>> 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
?