Python 如何在不在当前会话中进行修改的情况下重新导入dictionary对象?

Python 如何在不在当前会话中进行修改的情况下重新导入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 >

假设我有以下模块:

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
>>> 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
语法)的空格,所以需要分两步进行(三步包括必要的导入):

  • 执行import importlib,blah以访问并调用实际模块
  • 运行
    importlib.reload(blah)
    以丢弃
    blah
    的模块缓存,并从磁盘重新读取它(新版本存储在缓存中,因此将来导入与
    blah
    相关的
    s请参阅新版本)
  • 再次从blah import a,someDict运行
    ,以提取
    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 import a,someDict运行
    ,以提取
    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
    分配了另一个值。这不是变异。请阅读以下内容:我发现引用该选项卡可能会让人困惑在这种情况下,问题在于重新绑定