首页 > 解决方案 > python - 将.json加载到字典中失败

问题描述

我正在尝试将所有内容从 .json 文件加载到 python 中的字典。

谁能向我解释为什么以下不起作用?

my_dict = {}

def change_dict(str_file_path, dict_param):
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)
  opened_file.close

change_dict(my_file_path, my_dict)

我用于文件的路径是正确的,当我直接使用 my_dict 而不是使用字典参数时,上述方法有效(但这不是我想要做的)。

我一直在使用 Pycharm,视觉辅助工具“向我展示”它将字典参数视为以后不会使用的东西,这也没有任何意义。

pycharm

打印 my_dict 显示 {} 。我想如果我尝试将字典参数作为值返回到我的全局字典中,它会起作用(但现在我不想这样做)但我想知道为什么上面的方法不起作用。

有任何想法吗?

谢谢

标签: pythonjsonfiledictionary

解决方案


考虑您的代码:

my_dict = {}

def change_dict(str_file_path, dict_param):
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)  # **
  opened_file.close()

change_dict(my_file_path, my_dict)  # *

在 (*) 处,您正在传递对my_dict. 这个“引用”只是一个存储地址的变量my_dict(如果你知道 C/C++,这就像一个指针)。我们称这个“地址变量”为 A。注意 A 指向的内存块my_dict不是对象本身。现在,在 (**) 处,您将这个“地址变量”/指针分配给由json.load(...). 它所做的只是将另一个地址写入这个“地址变量”/指针,而原始内存块(my_dict)保持不变。

但是,如果您不更改指针的值,而是调用一个函数进行修改my_dictupdate()那么您可以my_dict在函数内部进行修改。例如:

import json

my_dict = {}


def change_dict(str_file_path, dict_param):
    with open(str_file_path) as opened_file:
        tmp = json.load(opened_file)
        dict_param.update(tmp)

change_dict('test.json', my_dict)
print(my_dict)

我的test.json文件在哪里:

{
  "apple": "banana",
  "pineapple": "papaya"
}

推荐阅读