我正在尝试将.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,视觉辅助工具向我“显示”它将字典参数视为以后不再使用的东西,这也没有任何意义。
打印my_dict显示{}。我想如果我尝试将字典参数作为值返回到我的全局字典中,它将起作用(但是现在我不想这样做),但是我想知道为什么上面的方法不起作用。
有什么想法吗?
谢谢
答案 0 :(得分:3)
考虑您的代码:
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_dict
,例如update()
,则可以在函数内部修改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"
}
答案 1 :(得分:1)
看来您什么也没返回。
尝试:
def change_dict(str_file_path):
with open(str_file_path) as opened_file:
dict_param = json.load(opened_file)
return dict_param
my_dict = change_dict(my_file_path)
如果您坚持使用全局变量(在这种情况下是不好的做法),可以尝试:
dict_param = {}
def change_dict(str_file_path):
global dict_param
with open(str_file_path) as opened_file:
dict_param = json.load(opened_file)
change_dict(my_file_path)
请注意,如果不返回值,则函数会自动返回None
。
这是一个使用全局变量的简单示例:
my_dict = {}
def something(key, value):
global my_dict
my_dict[key] = value
def something_else():
global my_dict
my_dict = {'c': 'd'}
def non_global():
my_dict = {'e': 'f'}
something('a', 'b')
print(my_dict) ## outputs: {'a': 'b'}
something_else()
print(my_dict) ## outputs: {'c': 'd'}
non_global()
print(my_dict) ## outputs: {'c': 'd'}
通常,函数返回答案要比将答案存储在超出范围的全局变量中更好。
答案 2 :(得分:1)
import json
def load_data(path):
with open(path,'r') as f:
return json.load(f)