我在pydocs中读到了有关import语句的内容。它说它分两步执行。 (1)找到一个模块,并在必要时进行初始化; (2)在本地名称空间(发生import语句的作用域)中定义一个或多个名称。第一种形式(没有来自)为列表中的每个标识符重复这些步骤。带有from的表单执行步骤(1)一次,然后重复执行步骤(2)。
我理解了它的一些内容,但它仍然不完全清楚。我主要是对初始化步骤感到困惑,最后说它重复了一些步骤。我理解的唯一一件事就是如果我们用say例如:
import sys
在这种情况下,如果我们在脚本中使用此模块的函数,我们需要使用sys.fun_name()调用它们。由于使用此importstatement无法在本地使用这些功能。 但是当我们使用
时from sys import argv
我们可以简单地使用argv函数,因为它使它在本地可用于srcipt。
有人可以向我解释其工作情况,也让我知道我的理解是否正确。
即使我尝试将我的一个脚本导入另一个脚本,它也会产生一些奇怪的结果,我知道这与import语句的第一步有关,(初始化)
##### ex17.py #####
def print_two(*args):
arg1, arg2 = args
print "arg1: %r, arg2: %r" %(arg1, arg2)
def print_two_again(arg1, arg2):
print "arg1: %r, arg2: %r" %(arg1, arg2)
def print_one(arg1):
print "arg1: %r" %arg1
def print_none():
print "I got nothing."
print_two("Gaurav","Pareek")
print_two_again("Gaurav","Pareek")
print_one("First!")
print_none()
####### ex18.py ######
import ex17
ex17.print_none()
执行ex18.py时我得到的输出如下
arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'Gaurav', arg2: 'Pareek'
arg1: 'First!'
I got nothing.
I got nothing.
为什么会这样。它应该只打印我一无所获。
答案 0 :(得分:0)
它打印"I got nothing."
两次,因为函数print_none
被调用两次。一旦加载ex17模块(因为它在ex18中导入)和一次在ex18模块中调用它。如果您不希望ex17中的函数调用执行但只需要加载函数defs,那么您可以按如下方式编写它们
## in ex17.py
if __name__ == '__main__':
print_two("Gaurav","Pareek")
print_two_again("Gaurav","Pareek")
print_one("First!")
print_none()
现在这个代码只有在作为脚本运行时才会被执行。 $ python ex17.py
但不是在将其导入其他模块时。有关__main__ here
关于文档的摘录,它简单地说明了两种导入形式的不同之处。步骤1负责查找和初始化模块,步骤2负责将名称添加到本地名称空间。所以,如果是,
import sys
步骤1和2都将执行一次。但是,如果,
from sys import argv, stdout
第1步将只执行一次,但第2步将执行两次,因为它需要将argv
和stdout
添加到本地命名空间。