Шаг 90.
Основы языка Python.
Словари. Создание словаря

    На этом шаге мы рассмотрим различные способы задания словаря.

    Создать словарь можно следующими способами:

    При создании словаря в переменной сохраняется ссылка на объект, а не сам объект. Это обязательно следует учитывать при групповом присваивании. Групповое присваивание можно использовать для чисел и строк, но для списков и словарей этого делать нельзя. Рассмотрим пример:

>>> d1 = d2 = {"a": 1, "b": 2} # Якобы создали два объекта
>>> d2["b"] = 10
>>> d1, d2 # Изменилось значение в двух переменных!!!
({'a': 1, 'b': 10}, {'a': 1, 'b': 10})

    Как видно из примера, изменение значения в переменной d2 привело также к изменению значения в переменной d1. To есть, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объекта, необходимо производить раздельное присваивание:

>>> d1, d2 = {"a": 1, "b": 2}, {"a": 1, "b": 2}
>>> d2["b"] = 10
>>> d1, d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})

    Создать поверхностную копию словаря позволяет функция diсt():

>>> d1 = {"a": 1, "b": 2} # Создаем словарь
>>> d2 = dict(d1) # Создаем поверхностную копию
>>> d1 is d2 # Оператор показывает, что это разные объекты 
False
>>> d2 ["b"] = 10
>>> d1, d2  # Изменилось только значение в переменной d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})

    Кроме того, для создания поверхностной копии можно воспользоваться методом сору():

>>> d1 = {"a": 1, "b": 2} # Создаем словарь
>>> d2 = d1.copy() # Создаем поверхностную копию
>>> d1 is d2 # Оператор показывает, что это разные объекты 
False
>>> d2 ["b"] = 10
>>> d1, d2  # Изменилось только значение в переменной d2
({'a': 1, 'b': 2}, {'a': 1, 'b': 10})

    Чтобы создать полную копию словаря, следует воспользоваться функцией deepcopy() из модуля copy:

>>> d1 = {"a": 1, "b": [20, 30, 40] }
>>> d2 = dict(d1)  # Создаем поверхностную копию 
>>> d2["b"][0] = "test"
>>> d1, d2 # Изменились значения в двух переменных!!!
({'a': 1, 'b': ['test', 30, 40]}, {'a': 1, 'b': ['test', 30, 40]})
>>> import copy
>>> d3 = copy.deepcopy(d1) # Создаем полную копию 
>>> d3["b"][1] = 800
>>> d1, d3 # Изменилось значение только в переменной d3
({'a': 1, 'b': ['test', 30, 40]}, {'a': 1, 'b': ['test', 800, 40]})

    На следующем шаге мы рассмотрим операции над словарями.




Предыдущий шаг Содержание Следующий шаг