Python:导入对象似乎不一致地破坏了现有对象?

时间:2019-06-24 20:25:52

标签: python python-import

因此,这最初是一个关于通过import命令导入数据对象的问题,我知道诸如pickle和json之类的东西以及其他各种方式可能是更好的选择,但是在尝试获取我的大脑在这周围发现了一种我确定具有逻辑依据的行为,但我无法弄清楚这种逻辑是什么。因此,我将以一个非常简单的示例进行演示...

我有一个名为“ toimport.py”的文件,仅包含字典定义:

foo = {
   "key1" : "value1",
   "key2" : "value2",
   "key3" : "value3",
}

下面,我运行一系列简单的命令:

首先,创建一个名为“ bar”的字典,并为其分配键/值对。

第二,将字典导入我的“要导入”文件中。我不确定导入是否会破坏现有密钥的值,看来确实如此:

Python 3.6.7 (v3.6.7:6ec5cf2, Oct 24 2018, 15:53:56) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.

 >>> bar = {"key1":"blue"}
 >>> print (bar)
{'key1': 'blue'}

 >>> from toimport import foo as bar
 >>> print (bar)                
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

好的,所以我想这就是Python导入的工作方式。没问题。 ;-)但是...如果我更改字典中的值之一,然后运行完全相同的导入命令...这一次它不会破坏我之前设置的值:

>>> bar['key1'] = 'zoomie'
>>> print (bar)           
{'key1': 'zoomie', 'key2': 'value2', 'key3': 'value3'}

>>> from toimport import foo as bar
>>> print (bar)                
{'key1': 'zoomie', 'key2': 'value2', 'key3': 'value3'}

我敢肯定对此有一个非常明智的解释,但是我不能自己开始弄清楚。 ;-)

1 个答案:

答案 0 :(得分:1)

“四处闲逛”不是思考这一问题的正确方法。与往常一样,对于Python变量,您应该考虑名称

您首先定义一个名称为“ bar”的字典。然后,您说“从toimport导入foo字典并为其指定名称栏”。因此,这将重新分配“ bar”以指向要导入的字典。

接下来,您修改字典。别忘了,名称指向对象,因此更改“栏”中某个键的值意味着该值将在引用该词典的各处处更改。如果您也将foo dict导入到其他地方,则该引用也会看到更改。

因此,第二次将foo导入为bar时,实际上是无操作的。您在两个地方都进行了更改,因此无需进行任何修改。 “ bar”已经是同一个字典的引用,再次导入它没有什么区别。