Рассмотрим ваш код:
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
внутри функции. E.g.:
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"
}