사전 생성 및 변경 가능한 객체: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!