>  기사  >  백엔드 개발  >  Python에서 *중복 문자(연산자)를 주의하세요.

Python에서 *중복 문자(연산자)를 주의하세요.

高洛峰
高洛峰원래의
2016-10-18 09:58:27943검색

파이썬에는 숫자 연산의 곱셈 연산자와 객체의 반복 연산자로 사용할 수 있는 특수 기호 "*"가 있습니다. 그러나 이를 반복 연산자로 사용할 때는 주의해야 합니다

참고: * 반복되는 각 개체는 동일한 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]]
>>>


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.