首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >名称冲突使用“from import”,而我不能使用导入的变量?

名称冲突使用“from import”,而我不能使用导入的变量?
EN

Stack Overflow用户
提问于 2018-01-16 22:43:13
回答 2查看 1K关注 0票数 3

例如:这里有fake.py文件和real.py文件。在fake.py

代码语言:javascript
代码运行次数:0
运行
复制
a = 'fake a'
b = 'fake b'

real.py

代码语言:javascript
代码运行次数:0
运行
复制
from fake import*
a = 'real a'
print(a,b)

然后打印出来:real a fake b

为什么会这样呢?

如果我想在a中使用fake.py怎么办?

我必须使用import fakefake.a吗?

‘模块中的语句(本例中为假语句?)仅在第一次导入模块时才执行。

这是什么意思?

我刚开始编程,请帮忙谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-16 22:50:54

远离from some_module import *,因为您将该模块的所有名称导入到当前模块命名空间中。

这将-在“名称冲突”的情况下,不仅覆盖任何先前定义的名称,而且,正如您所看到的,它们也可能被覆盖。

为什么会这样呢?

在您的例子中,from fake import *大致相当于:

代码语言:javascript
代码运行次数:0
运行
复制
# equivalent to "from fake import *"
import fake
a = fake.a
b = fake.b
del fake

# Rest of the file
a = "real a"
print(a, b)

因此,难怪"fake a"无法访问(也不打印)。

我必须使用import fakefake.a吗?

如果您想“减少”这类名称冲突的相似之处,这是一个很好的开端:

代码语言:javascript
代码运行次数:0
运行
复制
import fake
a = "real a"
print(a, fake.a, fake.b)

但您也可以使用别名:

代码语言:javascript
代码运行次数:0
运行
复制
import fake as f
a = "real a"
print(a, f.a, f.b)

您还可以从fake导入特定的名称(也带有别名):

代码语言:javascript
代码运行次数:0
运行
复制
from fake import a as fake_a, b as fake_b
a = "real a"
print(a, fake_a, fake_b)

至于

如果我想在a中使用fake.py怎么办?

应该没有问题,因为在fake.py中没有导入,所以没有名称冲突。

票数 4
EN

Stack Overflow用户

发布于 2018-01-16 22:53:34

问题

您将从fake.py (a & b)导入两个全局变量,然后将一个新值分配给其中一个(a)。

解决方案

如果您想使用fake.a和fake.b,那么删除import指令中的*。使用此导入指令:

代码语言:javascript
代码运行次数:0
运行
复制
import fake

然后,您将能够使用此表单访问a&b变量。

代码语言:javascript
代码运行次数:0
运行
复制
fake.a
fake.b
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48291021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档