파이썬에는 숫자 연산의 곱셈 연산자와 객체의 반복 연산자로 사용할 수 있는 특수 기호 "*"가 있습니다. 그러나 이를 반복 연산자로 사용할 때는 주의해야 합니다
참고: * 반복되는 각 개체는 동일한 ID를 가지므로 각 개체를 조작할 때 주의해야 합니다.
예:
>>> alist = [range(3)]*4 >>> alist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
위는 행렬을 시뮬레이션하기 위해 2단계 목록을 초기화합니다. 행렬은 4X3, 설명된 대로 편의상 여기서는 행렬 A를 호출하겠습니다.
이제 다음 코드를 사용하여 A11에 1의 값을 할당하고 싶습니다.
1
alist[ 0][ 0]=1
그러면 우리가 원하는 결과는 다음과 같습니다:
1
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
하지만 불행히도 우리가 얻은 것은
1
[[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]] >>>