Python의 중첩 목록 가변성 혼란
소개:
Python에서는 일반적인 문제 중첩된 목록을 처리할 때 발생합니다. 하위 목록에 대한 변경 사항은 예기치 않게 외부 목록의 다른 모든 하위 목록에 영향을 미칩니다. 이 예상치 못한 동작은 목록 생성 및 변경 가능성의 기본 메커니즘에서 비롯됩니다.
문제:
다음 코드를 고려하세요.
xs = [[1] * 4] * 3
이것은 코드는 각 하위 목록에 4개의 1이 포함된 목록 목록을 만듭니다. 그러나 아래와 같이 가장 안쪽 요소 중 하나를 수정하면 모든 하위 목록에 영향을 줍니다.
xs[0][0] = 5
첫 번째 하위 목록의 첫 번째 요소만 변경하는 대신 모든 하위 목록의 첫 번째 요소가 모두 5로 수정됩니다.
이유:
이 행동을 이해하는 열쇠는 다음과 같습니다. Python은 시퀀스를 곱합니다. 기존 목록 [x]에 * 연산자를 사용하면 새 목록이 생성되지 않습니다. 대신 동일한 목록 객체에 대한 여러 참조를 생성합니다.
결과적으로 코드 xs = [[1] * 4] * 3에서 표현식 [1] * 4는 한 번 평가되고 세 번 평가됩니다. 해당 단일 목록에 대한 참조는 외부 목록에 할당됩니다. 이는 모든 하위 목록이 동일한 객체임을 의미합니다.
해결책:
독립적인 하위 목록을 생성하려면 List Comprehension을 사용할 수 있습니다.
xs = [[1] * 4 for _ in range(3)]
이 경우 목록 이해는 각 반복에 대해 [1] * 4 표현식을 재평가하여 세 가지 고유한 결과를 얻습니다. 목록.
정수 불변성:
Python의 정수는 불변이므로 값을 변경할 수 없다는 점에 유의하는 것이 중요합니다. 따라서 * 연산자가 동일한 목록에 대한 여러 참조를 생성하더라도 해당 목록 내의 정수 값은 영향을 받지 않습니다.
위 내용은 중첩된 Python 목록에서 하위 목록을 수정하면 모든 하위 목록에 영향을 미치는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!