>백엔드 개발 >파이썬 튜토리얼 >변경 가능한 값을 가진 `dict.fromkeys`가 공유 객체를 생성하는 이유는 무엇입니까?

변경 가능한 값을 가진 `dict.fromkeys`가 공유 객체를 생성하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 03:16:27283검색

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

fromkeys를 사용한 변경 가능한 개체 및 사전 생성

목록과 같은 변경 가능한 개체가 포함된 사전을 생성하기 위해 dict.fromkeys를 사용할 때 관찰된 동작은 처음에는 놀랄 수 있습니다. 다음 예에서는 문제를 보여줍니다.

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>

이 경우 두 개의 키(0과 1)와 각 값에 대한 빈 목록이 있는 사전을 만듭니다. 그러나 키 0과 연결된 목록에 요소를 추가하면 키 1과 연결된 목록에도 나타납니다.

이 동작을 이해하려면 dict.fromkeys가 동일한 값 개체를 공유한다는 점에 유의하는 것이 중요합니다. 모든 키 사이. 이 예에서 xs[0]과 xs[1]은 모두 아래와 같이 동일한 목록 개체를 가리킵니다.

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>

따라서 xs[0]을 통해 목록에 적용된 모든 수정 사항도 반영됩니다. xs[1]에서 동일한 기본 개체를 참조하기 때문입니다.

반대로 사전 이해를 사용하여 변경 가능한 개체가 포함된 사전을 생성하면 각 값이 별도의 개체가 됩니다.

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>

이 경우 xs[0]과 xs[1]은 동일한 객체가 아니므로 xs[0]을 수정해도 xs[1]에 영향을 주지 않습니다.

Python 2.6 이하에서는 사전 이해가 사용할 수 없는 경우 dict()와 함께 생성기 표현식을 사용하여 사전 이해와 동일한 동작을 달성할 수 있습니다.

<code class="python">xs = dict((i, []) for i in range(2))</code>

위 내용은 변경 가능한 값을 가진 `dict.fromkeys`가 공유 객체를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.