"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > `dict.fromkeys()`가 Python에서 공유 변경 가능 객체를 생성하는 이유는 무엇입니까?

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

2024-11-08에 게시됨
검색:306

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

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

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

xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)

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

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

xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)

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

차이가 있는 이유는 무엇입니까?

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

a = []
xs = dict.fromkeys(range(2), a)

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

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

xs = dict((i, []) for i in range(2))
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3