Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新加载模块是否会更改先前导入/重新加载的模块中的名称?_Python - Fatal编程技术网

Python 重新加载模块是否会更改先前导入/重新加载的模块中的名称?

Python 重新加载模块是否会更改先前导入/重新加载的模块中的名称?,python,Python,我有一个名为myfile.py的模块 //myfile.py msg = 'Hello World' 然后我导入它:importmyfile 然后我做了一些修改,例如: //myfile.py (updated) a = 'Some text' b = 'Some other text' 然后调用重载函数: from imp import reload reload(myfile) 现在当我运行时:dir(myfile) 它显示当前模

我有一个名为
myfile.py的模块

    //myfile.py
    msg = 'Hello World'
然后我导入它:
importmyfile

然后我做了一些修改,例如:

    //myfile.py (updated)
    a = 'Some text'
    b = 'Some other text'
然后调用重载函数:

    from imp import reload
    reload(myfile)
现在当我运行时:
dir(myfile)
它显示当前模块重新加载以及以前模块(所有其他以前的导入/重新加载)的名称

这是否意味着在导入/重新加载模块时,“所有”名称(甚至更新后省略的名称)可单独用于外部世界

重新加载模块时,其字典(包含模块的全局变量)将被保留。名称的重新定义将覆盖旧的定义,因此这通常不是问题。如果新版本的模块未定义旧版本定义的名称,旧定义仍保留


模块在重新加载前未擦除。模块的新代码在所有旧变量绑定仍然存在的情况下执行。新代码定义的任何名称都将替换旧绑定,但新版本未定义的任何名称都将保留其旧值

Use可以使用Python的内置函数。从文档中:

执行重新加载(模块)时:

  • Python模块的代码被重新编译,模块级代码被重新执行,定义了一组绑定到名称的新对象
    在模块的字典中。扩展模块的init函数是 没有第二次打电话
  • 与Python中的所有其他对象一样,旧对象只有在其引用计数降至零后才会被回收
  • 模块命名空间中的名称将更新为指向任何新的或更改的对象
  • 对旧对象的其他引用(例如模块外部的名称)不能用于引用新对象,必须
    如果需要,在每个名称空间中进行更新
以下是一个例子:

首先,我们创建一个文件,该文件定义一个变量
msg
,以及一个打印它的方法

// myfile.py
msg = 'Hello World'
def x():
    print msg

// run from the shell
shell1$ python
>>> import myfile
>>> myfile.x()
Hello World
现在我们修改文件,删除变量
msg
,并添加
a
b
变量(不退出当前的Python REPL)

//myfile.py-已更新
a=‘一些文本’
b=‘其他一些文本’
def x():
打印“%s:%s%”(a,b)
//从同一个python会话运行
>>>重新加载(myfile)
>>>myfile.x()
一些文本:一些其他文本
如果您已经使用外部编辑器编辑了模块源文件,并且希望在不离开Python解释器的情况下试用新版本,那么这将非常有用


最后一点注意:
reload(myfile)
仅重新加载指定的模块。必须单独重新加载模块的(myfile)导入。此外,任何引用模块中任何内容的对象(例如,其类在模块中定义的实例)都将继续使用以前加载的值。

我想知道为什么文档没有写入docstring中,以便我们只需键入
help(imp.reload)
// myfile.py - updated
a = 'Some text'
b = 'Some other text'
def x():
    print '%s: %s' % (a, b)

// run from the same python session
>>> reload(myfile)
<module 'myfile' from 'myfile.pyc'>
>>> myfile.x()
Some text: Some other text