В этом случае объект словаря {'hello': 'world'}
создается в памяти, а затем ему присваивается x
.Назначение y=x
назначает секунду ссылку на объект словаря, на этот раз y
.
Однако y
НЕ является указателем на указатель x
.Переназначение x
не меняет то, на что ссылается y
.
Для вашего второго вопроса в данном конкретном случае разницы нет.
Использование:
x = {'test':1}
y = dict(x)
Создает новую копию словаря и присваиваетэто к y
.
Использование:
y = copy.deepcopy(x)
Создание идентичной копии.Разница в том, что значение словаря было изменяемым объектом, например списком.
Здесь y
- это мелкая копия x
:
x = {'test': [1,2,3]}
y = dict(x)
Таким образом, изменение списка внутри объекта словаря, на который ссылается x
, также будет отображаться и в y
.
x['test'][1] = 0
y
# returns:
{'test': [1, 0, 2]}
Однако использование:
x = {'test': [1,2,3]}
y = copy.deepcopy(x)
создаст копиюосновного объекта, а также всех объектов, которые он содержит.Поэтому теперь изменение списка в x
не изменит значения y
.
x['test'][1] = 0
y
# returns
{'test': [1,2,3]}