Python导入:将在“中更改变量”;“儿童”;在“中更改变量”;“家长”/其他孩子?

Python导入:将在“中更改变量”;“儿童”;在“中更改变量”;“家长”/其他孩子?,python,import,Python,Import,假设您有3个模块,a.py、b.py和c.py: a、 py: b、 py: c、 py: c.py会改变a.py和b.py中的v1吗?如果没有,有办法吗?是的,您只需要正确地访问它(不要使用import*,它是邪恶的) c、 py: 来自。。。导入*表单基本上是为了在解释器提示下方便地进行交互使用:最好不要在其他情况下使用它,因为它只会给您带来问题 事实上,我的雇主的内部风格指南更进一步,建议始终导入模块,而不要从模块内导入内容(从包内导入模块是可以的,事实上是推荐的)。因此,在我们的代码库中

假设您有3个模块,a.py、b.py和c.py:

a、 py:

b、 py:

c、 py:


c.py会改变a.py和b.py中的v1吗?如果没有,有办法吗?

是的,您只需要正确地访问它(不要使用import*,它是邪恶的)

c、 py:


来自。。。导入*表单基本上是为了在解释器提示下方便地进行交互使用:最好不要在其他情况下使用它,因为它只会给您带来问题

事实上,我的雇主的内部风格指南更进一步,建议始终导入模块,而不要从模块内导入内容(从包内导入模块是可以的,事实上是推荐的)。因此,在我们的代码库中,对导入内容的引用总是限定名(
themod.thething
),而不是单名(总是指内置、同一模块的全局或局部);这使得代码更加清晰易读,避免了各种微妙的异常

当然,如果一个模块的名称太长,导入中的
as
子句可以为其提供一个更短、更方便的别名,以便导入模块。但是,使用一个字母的模块名称,就不需要了;-)

因此,如果您遵循指导原则并始终导入模块(而不是从模块内部导入内容),
c.v1
将始终引用与
a.v1
b.v1
相同的内容,用于获取和设置:这里有一个潜在的细微异常可以立即避免!)

还记得Python禅宗的最后一点吗(在解释器提示下导入此文件以查看所有内容):


导入整个模块(而不是其中的位和块)可以保持其作为名称空间的完整性,就像总是通过限定(虚线)名称引用导入模块内的内容一样。这是一个非常好的主意:多做一点

所有这些都是一种说法,比如:

v1 = 0
可以做的是将名称
v1
绑定到对象
0
。它不会影响其他模块

如果我在那里使用了不熟悉的术语,我想我可能是,我强烈建议你阅读Fredrik Lundh的优秀文章。

所以你永远不会“从日期时间导入日期时间”;您总是导入datetime,每次都键入“datetime.datetime”吗?这是一个糟糕的风格指南。@Glenn,对于你的问题,“是”;在您看来,我不知道有任何Python风格的指南被更多的Python提交者(包括Guido;-)积极接受(并通过“可读性审查”强制实施),我们的Python软件似乎相当成功(包括上市时间、可维护性、性能[cfr YouTube、基于Python和fast]等),所以我想知道你是根据什么经验数据得出这个观点的。是的,PEP8确实接受“导入类”,但Guido在加入谷歌之前写道,他遇到(并接受并实施)了我们令人敬畏的风格指南写“datetime.datetime”非常难看;“datetime.datetime.now”更难看;鼓励丑陋代码的编码风格是不好的。更广泛地说,当类本身是名称空间时,将模块作为名称空间是毫无帮助的。导入作为名称空间的级别——对于许多模块,这是模块本身,但对于datetime之类的类,则是类。
from a import *
from a import *
v1 = 0
import a
print a.v1 # prints 1
a.v1 = 0
print a.v1 # prints 0
Namespaces are one honking great idea -- let's do more of those!
v1 = 0