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

`dict.fromkeys()`가 Python에서 공유 변경 가능 객체를 생성하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-25 16:27:02255검색

 Why does `dict.fromkeys()` create shared mutable objects in Python?

사전 생성 및 변경 가능한 객체: fromkeys의 놀라운 동작

Python에서 dict.fromkeys()를 사용하여 사전을 생성할 때 예상치 못한 상황이 발생할 수 있습니다. 변경 가능한 객체가 값으로 사용될 때 발생합니다. 다음 예를 고려하십시오.

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

사전 키 0과 1에 대한 값으로 두 개의 개별 목록 개체를 생성하더라도 인덱스 0의 목록에 요소를 추가하면 해당 요소가 인덱스 1의 목록에도 추가됩니다. fromkeys가 각 키를 변경 가능한 객체의 동일한 참조에 바인딩하여 공유 수정이 발생하기 때문에 발생합니다.

반대로 Python 3.2의 사전 이해는 다른 동작을 나타냅니다.

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

여기서 각 키는 키는 고유한 목록 개체에 바인딩되어 있습니다. 인덱스 0의 목록에 요소를 추가해도 인덱스 1의 목록에는 영향을 주지 않습니다.

왜 차이점이 있나요?

fromkeys의 동작은 다음을 고려하여 이해할 수 있습니다. 다음과 같은 동등한 코드:

<code class="python">a = []
xs = dict.fromkeys(range(2), a)</code>

결과 사전의 각 키는 동일한 객체를 참조하여 공유 수정이 관찰됩니다.

각 키에 대해 고유한 변경 가능 객체의 원하는 동작을 달성하려면 , 사전 이해를 사용하거나, 사전 이해가 없는 Python 2.6 이하의 경우 생성기 표현식과 함께 dict()를 사용하세요:

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

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

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