name collision使用'from import',我不能使用导入的变量?

时间:2018-01-16 22:43:13

标签: python

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

a = 'fake a'
b = 'fake b'

real.py

from fake import*
a = 'real a'
print(a,b)

然后打印出来:real a fake b

为什么?
如果我想在a中使用fake.py该怎么办? 我必须使用import fakefake.a吗?

  模块中的

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

这是什么意思?

我是编程新手请帮忙谢谢。

2 个答案:

答案 0 :(得分:4)

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

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

  

为什么?

您的案例中的from fake import * 非常粗略等同于:

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

如果你想“减少”这种名称冲突的可能性,这是一个良好的开端:

import fake
a = "real a"
print(a, fake.a, fake.b)

但您也可以使用别名:

import fake as f
a = "real a"
print(a, f.a, f.b)

您还可以从fake(也包含别名)导入特定名称:

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中没有导入,因此没有名称冲突。

答案 1 :(得分:1)

问题

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

解决方案

如果你想使用fake.a和fake.b然后去掉import指令中的*。使用此导入指令:

fake.a
fake.b

然后您就可以访问a& b带有此形式的变量

if len(rowdata) > 0:
    dataSet.append(rowdata)