Изменение словаря внутри функции без оператора возврата - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь изменить словарь внутри функции.А так как словари являются изменчивыми типами данных.Мне было интересно, если обратное утверждение необходимо?

Например:

def modify_dict(a_dict,a_key,a_value):
    a_dict = {a_key:a_value}

# Why wouldn't the function actually modify the dictionary? 
# Wouldn't the dictionary still be changed to sample_dict={e_key:e_value} anyways?

sample_dict = {b_key:b_value,c_key:c_value,d_key:d_value}
modify_dict(sample_dict,e_key,e_value)

Ответы [ 4 ]

1 голос
/ 26 мая 2019

Переменными объекта Python являются ссылки .
Оператор присваивания в python работает не с самими значениями, а с этими ссылками.

a = [1,2] # creates object [1,2]
b = [3,4] # creates object [3,4]

# a now holds a reference to [1,2]
# b now holds a reference to [3,4]

c = a

# c now holds a reference to [1,2] as well

c = [5,6] # creates object [5,6]

# c now holds a reference to [5,6] and forgets about the [1,2].
# This does NOT change the [1,2] object.

То же самое относится к вызову вашей функции:

def modify_dict(a_dict,a_key,a_value):
    # a_dict is a REFERENCE to whatever the argument of the function is

    a_dict = {a_key:a_value} # creates a new dict
    # a_dict now holds a reference to that NEW dict and forgets what it
    # was previously referencing.
    # This does not influence the object that was given as an argument

Я думаю, чтоКлючевым понятием, которое следует понимать здесь, является то, что аргументы внутри функций - это ссылки на объекты, а не на сами объекты.

Чтобы фактически изменить a_dict, вам нужно получить к нему доступ напрямую, а не присваивать ему,как:

def modify_dict(a_dict,a_key,a_value):
    a_dict[a_key] = a_value
1 голос
/ 26 мая 2019

Ваш запрос на изменение не изменяет переменную. Это привязывает его.

Попытка:

def modify_dict(a_dict,a_key,a_value):
    a_dict[a_key] = a_value

И нет .. вам не нужно "возвращаться".

0 голосов
/ 26 мая 2019

Несмотря на то, что вы можете изменить dict на месте, вы присваиваете стековую переменную a_dict новому словарю, которая отличается от изменения значения в dict.Вы хотите что-то еще как:

test = {'k1': 'v1', 'k2': 'v2'}
def changes_dict(d, k, new_v):
    d[k] = new_v

changes_dict(test, 'k1', 'changed')
test['k1']
# 'changed'
0 голосов
/ 26 мая 2019

Когда вы переназначаете a_dict внутри функции, вы фактически создаете новый словарь с тем же именем, что и за пределами области действия функции. Если вы обновите словарь, это изменение будет видно за пределами области действия функции, но вы переназначаете имя.

...