> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 *중복 문자(연산자)를 주의하세요.

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

大家讲道理
풀어 주다: 2016-11-07 17:21:23
원래의
1345명이 탐색했습니다.

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

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


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿