27.2 딕셔너리의 할당과 복사

리스트와 마찬가지로 딕셔너리도 할당과 복사는 큰 차이점이 있습니다. 다음과 같이 딕셔너리를 만든 뒤 다른 변수에 할당하고, 키의 값을 변경합니다.

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x
>>> y['a'] = 99
>>> x
{'a': 99, 'b': 0, 'c': 0, 'd': 0}
>>> y
{'a': 99, 'b': 0, 'c': 0, 'd': 0}

y = x와 같이 딕셔너리를 다른 변수에 할당하면 딕셔너리는 두 개가 될 것 같지만 실제로는 딕셔너리가 한 개입니다. 그래서 y['a'] = 99와 같이 딕셔너리 y의 값을 변경하면 딕셔너리 xy에 모두 반영됩니다.

is 연산자로 비교를 해보면 True가 나오므로 두 객체는 같습니다. 물론 딕셔너리 안에 들어있는 키와 값도 같으므로 ==로 비교하면 True가 나옵니다.

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x
>>> x is y
True
>>> x == y
True

여기서 딕셔너리를 완전히 두 개로 만들려면 copy()로 키-값 쌍을 모두 복사해야 합니다.

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x.copy()
>>> y['a'] = 99
>>> x
{'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y
{'a': 99, 'b': 0, 'c': 0, 'd': 0}
>>> 

y = x.copy()와 같이 copy를 사용한 뒤 y에 할당해주면 딕셔너리 x의 키-값 쌍이 모두 y에 복사됩니다. 이제 딕셔너리 xy는 별개이므로 값을 변경해도 다른 딕셔너리에 영향을 미치지 않습니다.

is 연산자로 비교해보면 False가 나오므로 두 객체가 다르다는 것을 알 수 있습니다. 물론 객체는 다르지만 딕셔너리 안에 들어있는 키와 값은 같으므로 ==로 비교하면 True가 나옵니다.

>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x.copy()
>>> x is y
False
>>> x == y
True