파이썬에는 숫자 연산의 곱셈 연산자와 객체의 반복 연산자로 사용할 수 있는 특수 기호 "*"가 있습니다. 그러나 이를 반복 연산자로 사용할 때는 주의해야 합니다
참고: * 반복되는 각 개체는 동일한 ID를 가지므로 각 개체를 조작할 때 주의해야 합니다.
예:
>>> alist = [range(3)]*4 >>> alist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
위에서는 설명의 편의를 위해 행렬을 시뮬레이션하기 위해 2단계 목록을 초기화합니다. 행렬은 여기에 A로 기록됩니다.
이제 다음 코드를 사용하여 A11에 1의 값을 할당하고 싶습니다.
alist[0][0]=1
그러면 우리가 원하는 결과는 다음과 같습니다.
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
하지만 불행히도 우리가 얻는 것은
[[1, 1, 2], [1, 1, 2], [1, 1, 2], [ 1, 1, 2]]
무슨 일이 일어나고 있나요? A21에 값이 할당된 이유는 무엇이며, 다른 Ai1도 이에 따라 변경되는 이유는 무엇인가요?
이유는 다음과 같습니다.
이미 글의 시작 부분에서 언급했습니다. * 반복되는 각 개체는 동일한 ID를 가지며 이는 메모리에서 동일한 주소를 가리킨다는 의미입니다. 각 개체를 조작할 때는 주의를 기울여야 합니다.
초기화할 때 반복 연산자 "*"를 사용했습니다. 이 연산자가 객체에 대한 작업을 반복하면 반복되는 모든 객체가 동일한 메모리 주소를 가리킵니다. 따라서 값이 있는 경우
다른 값은 자연스럽게 업데이트됩니다. Python에서의 설명은 다음 명령과 출력입니다.
>>> id(alist[0]) 18858192 >>> id(alist[1]) 18858192 >>> id(alist[2]) 18858192 >>> id(alist[3]) 18858192 >>>
보세요. id는 모두 동일합니다. 이는 이 4개의 목록이 동일한 "목록"임을 의미합니다.
이 경우 행렬을 시뮬레이션하려면 어떻게 해야 합니까? 특별한 numpy 패키지 외에도 새 목록을 상위 수준 목록에 하나씩 추가할 수 있습니다. 예를 들면 다음과 같습니다.
>>> blist=[] >>> for i in range(4): blist.append([j for j in range(3)]) >>> blist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
이런 식으로 위의 할당 작업을 다시 시도해 보겠습니다.
>>> blist[0][0]=1 >>> blist [[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] >>>