python 에서 remove 에 대한 구덩이 소결

며칠 전,python 을 사용 할 때 이러한 요 구 를 만 났 습 니 다.목록 의 값 이 1 인 요 소 를 삭제 합 니 다.나 는 remove 방법 을 곰 곰 이 생각 했 지만,remove 방법 은 첫 번 째 만 삭제 하기 때문에,나 는 for 순환 을 사용 하여 삭제 했다.코드 와 실행 결 과 는 다음 과 같 습 니 다.

당시 이 결 과 는 나 를 매우 멍 하 게 만 들 었 는데,왜 1 이 다 삭제 되 지 않 았 습 니까?자 료 를 찾 아 보 니 for 순환 이 꾸 민 짓 이 었 다.for 순환 은 실제 순환 하 는 목록 아래 표 시 됩 니 다(색인).또한 목록 의 가 변성 으로 인해 하나의 요 소 를 삭제 할 때마다 목록 의 길이 가 달라 지고 요소 의 색인 도 달라 집 니 다.여기 서 이 코드 를 구체 적 으로 분석 해 보 자.
첫 번 째 순환,순환 색인 은 0 입 니 다.이때 색인 이 0 인 요 소 는 1 로 조건 을 만족 시 키 기 때문에 my list 의 첫 번 째 1 이 삭제 되 었 습 니 다.이때 my list 는[1,2,1,1,3,4]로 변 했 습 니 다.
두 번 째 순환,순환 색인 은 1 입 니 다.이때 새 목록 에서 색인 이 1 인 요 소 는 2 이 고 조건 에 만족 하지 않 습 니 다.my list 는 여전히[1,2,1,1,3,4]입 니 다.
세 번 째 순환,순환 색인 은 2 입 니 다.이때 목록 에서 색인 이 2 인 요 소 는 1 입 니 다.조건 을 만족 시 키 면 reove 방법 은 1 을 다시 삭제 하지만 reove 는 처음 나타 난 1(즉 색인 이 0 인 그 1 을 삭제 하 는 것)을 삭제 하기 때문에 목록 은[2,1,1,3,4]로 변 합 니 다.
네 번 째 순환,순환 색인 은 3 이 고 새 목록 에서 색인 이 3 인 요 소 는 3 이 며 조건 에 만족 하지 않 습 니 다.my list 는 여전히[2,1,1,3,4]입 니 다.
다섯 번 째 순환,순환 색인 은 4 입 니 다.이때 목록 에서 색인 이 4 인 요 소 는 4 이 고 조건 에 만족 하지 않 습 니 다.my list 는 여전히[2,1,1,3,4]입 니 다.
이 때 새 목록 의 길이 가 5 이기 때문에 순환 이 끝 납 니 다.
아래 의 캡 처 결 과 는 직관 적 으로 볼 수 있다.

이로써 이런 코드 라면 결 과 는 어떻게 될 까?

최종 mylist=['b','d'],어때요? 당신 이 계산 한 값 과 같 나 요?
최초의 요구 로 돌아 가 모든 1 을 삭제 할 수 있 는 방법 은 deepcopy 를 사용 하여 복사 할 수 있 습 니 다.그 다음 목록 은 순환 에 사용 되 고 하 나 는 값 을 제거 하 는 데 사 용 됩 니 다.코드 와 결 과 는 다음 과 같 습 니 다.

이렇게 하면 목록 의 모든 값 이 1 인 요 소 를 삭제 할 수 있 습 니 다.여기 서 l1 을 변수,즉 l2=l1 에 직접 할당 하지 않 는 이 유 를 묻 는 사람 이 있 을 수 있 습 니 다.여기 서 인용 과 깊이 복사 에 관 한 문제 가 있 기 때문에 여기 서 풀 지 않 습 니 다.
첨부:Python 목록 의 reove 방법 에 대한 주의사항

왜 목록 의 모든 요 소 를 삭제 하지 않 았 습 니까?
설명:
실행 순서에 따라 첫 번 째 빈 칸 이 삭 제 된 후에 뒤의 요 소 는 앞으로 이동 합 니 다(['빈 칸','빈 칸','12','23').지침 은 다음 에 새 목록 의 두 번 째 요소(즉,초기 상태의 세 번 째 빈 칸)를 가리 키 며 초기 상태의 두 번 째 빈 칸 은 건 너 뛰 고 첫 번 째 세 번 째 빈 칸 은 삭 제 됩 니 다.이 어 뒤의 요 소 는 다시 앞으로 이동 합 니 다('빈 칸'으로 변 합 니 다.'12','23')새 목록 의 세 번 째 요소,즉 초기 상태의 다섯 번 째 요소 23 을 가리 키 고 23 이 삭제 되 었 기 때문에['빈 칸','12']만 남 았 습 니 다.
초기 목록 의 일부 요 소 를 제거 하려 면 어떻게 실현 합 니까?
위의 상황 에서 알 수 있 듯 이 목록 을 옮 겨 다 니 는 동시에 목록 을 삭제 하 는 작업 을 수행 하면 의외 의 결 과 를 초래 할 수 있 습 니 다.그러면 초기 목록 을 옮 겨 다 니 며 초기 목록 의 사본 을 삭제 하 는 작업 을 수행 하 시 겠 습 니까?

이상 의 결 과 는 기대 효 과 를 얻 지 못 한 것 으로 나 타 났 다.왜?
문 제 는 copy=ls 라 는 말 입 니 다.여 기 는 copy 와 ls 가 같은 메모리(즉,얕 은 복사,shallow copy)를 가리 키 는 것 일 뿐 입 니 다.[새 메모 리 를 만 들 고 ls 메모리 의 내용 을 새 메모리 로 복사 한 다음 에 copy 가 새로 개 설 된 메모리,즉 깊 은 복사,deep copy]라 는 일련의 작업 을 수행 하지 않 았 습 니 다.따라서 copy 에서 실 행 된 reove 작업 은 ls 목록 을 옮 겨 다 니 는 것 과 실질 적 으로 같은 메모리 에 대한 작업 이기 때문에 결 과 는 유사 합 니 다.
이 문 제 를 해결 하려 면 세 가지 방법 이 있다.
(1)

ls=[' ',' ',' ','12','23','abc','aa']
copy=[' ',' ',' ','12','23','abc','aa']
 
이 방법 은 이미 알 고 있 는 목록 의 모든 요소 에 대해 요소 의 수량 이 적 고 구조 가 간단 할 때 가능 하 며 다른 상황 에 서 는 불가능 합 니 다.
(2)copy 모듈 을 도입 하 는 deepcopy 방법:

(3)빈 목록 을 따로 준비 하여 초기 목록 을 옮 겨 다 닐 때 조건 에 맞 는 요 소 를 빈 목록 에 하나씩 추가 합 니 다(목록 을 이용 한 append 방법).
이런 방법 은 사고방식 은 remove 방법 과 상반 되 지만 실행 하 는 조작 차이 가 많 지 않 고 시간 복잡 도도 remove 방법 과 차이 가 많 지 않 기 때문에 copy 모듈 을 도입 할 필요 가 없다.
또한 목록 의 reove 방법 에 대해 python 기초 튜 토리 얼 2 판 은 다음 과 같이 설명 합 니 다.
remove 방법 은 목록 의 첫 번 째 일치 항목 을 제거 하 는 데 사 용 됩 니 다:

>>>x=['to','be','or','not','to','be']

>>>x.remove('be')

>>>x

['to','or','not','to','be']

python 에서 reove 에 관 한 일부 구덩이 소결 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 에서 reove 에 관 한 구덩이 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기