Python 如何在不在当前会话中进行修改的情况下重新导入dictionary对象?
假设我有以下模块: blah.pyPython 如何在不在当前会话中进行修改的情况下重新导入dictionary对象?,python,python-3.x,python-import,Python,Python 3.x,Python Import,假设我有以下模块: blah.py a = 1 someDict = {'a' : 1, 'b': 2, 'c' : 3} 在下一个python会话中,我将获得以下内容: >>> from blah import a, someDict >>> a 1 >>> someDict {'a': 1, 'b': 2, 'c': 3} >>> a = 100 >>> someDict['a'] = 100 >
a = 1
someDict = {'a' : 1, 'b': 2, 'c' : 3}
在下一个python会话中,我将获得以下内容:
>>> from blah import a, someDict
>>> a
1
>>> someDict
{'a': 1, 'b': 2, 'c': 3}
>>> a = 100
>>> someDict['a'] = 100
>>> del a, someDict
>>> from blah import a, someDict
>>> a
1
>>> someDict['a']
100
>>> import blah
>>> blah.someDict['a']
100
当我修改从另一个模块导入的对象,然后重新导入该对象时,它会恢复其在模块中表示的原始值。但这不适用于字典中的值。如果我想在进行任何修改后恢复
someDict
的原始值,我必须关闭当前的python会话并打开一个新会话。我发现,如果我只调用一个修改dict元素的函数,这甚至是正确的
为什么会发生这种情况?有什么方法可以在不启动新的python会话的情况下重新导入字典的原始值吗?因为您取消了
dict
(使用from x import y
语法)的空格,所以需要分两步进行(三步包括必要的导入):
importlib.reload(blah)
以丢弃blah
的模块缓存,并从磁盘重新读取它(新版本存储在缓存中,因此将来导入与blah
相关的s请参阅新版本)
,以提取blah的刷新内容
a
出现问题的原因是,在执行blah import a中的之后,a
并不特别<代码>\uuu main\uuuu.a
只是blah.a
的另一个别名,但由于a=100
将a
重新绑定到一个全新的int
(而且由于int
s是不可变的,即使a+=100
实际上也会执行重新绑定),您从未更改blah.a
(您必须显式地执行导入blah
,blah.a=100
才能实现这一点)
someDict
是一个问题,因为像a
、\uuu main\uuuu.someDict
和blah.someDict
一样,someDict最终成为同一个dict
的别名,而您对该dict
进行变异,您就不会重新绑定\uu main\uuuuu.someDict>本身。如果您想避免在第一个blah
的值发生变异放置时,确保对someDict
的第一次修改将其重新绑定到一个新的dict
,而不是修改与之共享的blah
,例如,代替:
someDict['a'] = 100
做:
要使用blah.someDict
的副本制作一个新的dict
,但其中的'a'
值被一个新值替换。因为您取消了dict
的空格(使用来自x import y
语法),您需要作为两步过程(三步包括必要的导入):
执行import importlib,blah
以访问并调用实际模块
importlib.reload(blah)
以丢弃blah
的模块缓存,并从磁盘重新读取它(新版本存储在缓存中,因此将来导入与blah
相关的s请参阅新版本)
,以提取blah的刷新内容
a
出现问题的原因是,从blah import a执行之后,a
并不特别;\uu main\uuuuu.a
只是blah.a
的另一个别名,但由于a=100
将a
重新绑定到一个全新的int
(由于int
s是不可变的,即使a+=100
实际上也会执行重新绑定),所以您从未更改过blah.a
(您必须显式地执行import blah
,blah.a=100
,才能实现这一点)
someDict
是一个问题,因为像a
、\uuu main\uuuu.someDict
和blah.someDict
一样,someDict
最终成为同一个dict
的别名,而您对该dict
进行变异,您就不会重新绑定\uu main\uuuuu.someDict>本身。如果您想避免在第一个blah
的值发生变异放置时,确保对someDict
的第一次修改将其重新绑定到一个新的dict
,而不是修改与之共享的blah
,例如,代替:
someDict['a'] = 100
做:
使用blah.someDict
的副本创建一个新的dict
,但其中的'a'
值被一个新值替换。这是重新绑定(对a
执行)和变异(对someDict
执行)之间的标准Python区别。“当我修改从另一个模块导入的对象,然后重新导入该对象时,它似乎会恢复其在模块中表示的原始值"-不,没有。a=100
不修改任何对象。您只修改dict对象,不能修改int
对象。您只是为当前模块命名空间中的名称a
分配了另一个值。这不是变异。请阅读以下内容:这是重新绑定之间的标准Python差异(对a
执行此操作)和变异(对someDict
执行此操作)“当我修改从另一个模块导入的对象,然后重新导入该对象时,它会恢复其在模块中表示的原始值。”-不,没有。a=100
不修改任何对象。您只修改dict对象,不能修改int
对象。您只是为当前模块命名空间中的名称a
分配了另一个值。这不是变异。请阅读以下内容:我发现引用该选项卡可能会让人困惑在这种情况下,问题在于重新绑定