python dict.copy()是否工作不正常?

python dict.copy()是否工作不正常?,python,json,Python,Json,我正在制作配置程序来帮助用户配置.json文件。该程序的一个功能是检查保存的json文件是否与用户创建的新json文件相同。如果两个.json不相同,它将告诉用户保存程序中正在配置的.json文件 我的第一个想法是每次检查两个.json文件是否相同时都从.json文件中读取。它看起来像这样: #从保存的json文件中读取 new#u settings={“key1”:1,“key2”:2,“array1”:[]}}json.load(open('config.json','r').read())

我正在制作配置程序来帮助用户配置
.json
文件。该程序的一个功能是检查保存的
json
文件是否与用户创建的新
json
文件相同。如果两个
.json
不相同,它将告诉用户保存程序中正在配置的
.json
文件

我的第一个想法是每次检查两个
.json
文件是否相同时都从
.json
文件中读取。它看起来像这样:

#从保存的json文件中读取
new#u settings={“key1”:1,“key2”:2,“array1”:[]}}json.load(open('config.json','r').read())
#修改新的\u设置
新的_设置['array1'].追加('Data')
def checkIsDifferent():
#从保存的json文件中读取
保存的_设置={“key1”:1,“key2”:2,“array1”:[]}#json.load(open('config.json','r').read())
如果保存了\u设置==新的\u设置:
打印('已保存配置')
其他:
打印(“(*)配置未保存”)
我不认为经常从文件中读取数据是比较“设置”的好方法,因此我想出了另一种方法,将保存的
.json
复制到一个变量中,然后使用该变量进行比较:

saved_settings={“key1”:1,“key2”:2,“array1”:[]}从保存的json文件读取
新建设置=保存的设置。复制()
#修改
新的_设置['array1'].追加('Data')
def checkIsDifferent():
如果保存了\u设置==新的\u设置:
打印('已保存配置')
其他:
打印(“(*)配置未保存”)
第一个解决方案出乎意料。运行
checkIsDifferent()
函数时,输出“(*)配置未保存”。但当我在第二个解决方案上运行
checkIsDifferent()
时,它输出了“配置已保存”

python中的
dict.copy()
是否已损坏?对于第二个解决方案,我如何修复它

我的信息: Python版本:Python 3.8.5(tags/v3.8.5:580FBB02020年7月20日15:43:08)[MSC v.1926 32位(英特尔)]

OS:Windows 10

copy()将只复制对非基元类型的任何对象的引用。改用deepcopy

from copy import deepcopy

saved_settings = {"key1": 1, "key2": 2, "array1": []} # read from the saved json file
new_settings = deepcopy(saved_settings)
# modify
new_settings['array1'].append('Data')

def checkIsDifferent():
    if saved_settings == new_settings:
        print('Configuration is saved')
    else:
        print('(*)Configuration is not saved')

dict.copy()。使用Instead非常确定您需要制作一个深度副本,以使它们与众不同。指向列表的指针将被复制,但列表将是相同的。当调用copy时,它将使用“key1”并为1分配新内存,因为1是不可变的(它是一个整数)。但是当它使用“array1”时,它不会为[]分配新内存,因为列表是可变的。@LPR Python还必须为空列表分配内存。@mkrieger1是的,您是正确的,但是当您以这种方式执行复制时,两个字典中的列表将是相同的。它不会创建新列表。你说的第一句话是什么意思?列表是对其他对象的引用的集合,copy将复制这些引用,而不管底层类型是什么,我认为copy也会复制对“基元类型”的引用(我不确定这个概念在Python中是否存在)。一切都是一个对象,列表包含对对象的引用。@IainShelvington抱歉,这句话用得不好。是的,它将复制列表,但是列表中不是基元类型(int、float、chr、str)的所有内容都将被复制referenced@rabl事实并非如此,那些“基本”类型的对象也只会referenced@IainShelvington看看这个代码;我刚刚用Python3测试了它,断言失败了,这意味着它不是通过int:
importcopy类型的引用传递的;列表=[2,3];参考=副本。副本(列表);列表[1]=6;断言(参考[1]==列表[1];