작성
·
188
0
안녕하세요 강의 잘 듣고 있습니다.
Exercise 38에 관해 질문드립니다.
지시사항을 보고 제가 처음 구상한 코드는 주어진 리스트에서 음수인 멤버를 제거한 뒤 0 이상의 정수만 남은 리스트를 출력하는 것입니다.
이 구상에 따라 필요한 작업을 구분해보니 다음과 같습니다 :
1. 주어진 리스트의 복본을 생성함.
- 음수 삭제 방식으로 하려니 원본을 조작하면 인덱스가 바뀌는 문제가 해결되지 않아 복본을 만드는 방법을 구상하였습니다.
2. for문으로 원본리스트의 인덱스를 순서대로 지나가도록 함.
2-1. for문 안에서 if문으로 원본리스트의 각 멤버가 음수인지 판별함.
2-2. 복본리스트의 멤버가 음수이면 복본리스트에서 remove메소드로 제거함.
3. 최종으로, 음수가 제거된 복본리스트를 출력함.
위의 구상대로 코드를 만들면 지시된 내용대로 출력이 될 줄 알았습니다.
그러나 코드를 작성하고 실행해보니 에러가 발생하였고 구체적으로 살펴보니 다음의 세 가지 문제가 있어보입니다 :
문제 1. "복본리스트(num_list_dupl)=원본리스트(num_list)" 식으로 작성하면 복본리스트를 remove메소드 등으로 조작해도 원본리스트는 불변하리라고 생각하였지만 원본리스트도 같이 변경됨을 확인하였습니다.
문제 2. 위 문제 1과 연계되어, 원본리스트가 변경되는 바람에 원본리스트 멤버의 음수여부 판단하는 if조건문에서 3번째 인덱스의 멤버인 33이 그냥 지나쳐버리는 문제가 있습니다. 이는 원본리스트가 변경되면서 인덱스도 바뀌어 발생한 것으로 추측합니다.
문제 3. 인덱스 6에서 에러가 발생하였습니다. 이 역시 문제 2에서 발견한 바와 같이 원본리스트가 변경되면서 인덱스 6이 없어진 이유로 발생한 에러로 파악합니다.
결국 문제의 근원은 제가 복본리스트를 만든 코드에 있는듯 합니다.
어떻게 하면 원본리스트가 불변하도록 복본리스트를 만들 수 있는지 알고 싶습니다.
긴 질문 읽어주셔서 감사합니다.
아래는 제가 작성한 해당 코드입니다.
num_list = [0, -11, 31, 22, -11, 33, -44, -55]
num_list_dupl = num_list
print("원본 리스트의 멤버 수는", len(num_list))
print("원본 리스트의 복본 리스트 : ", num_list_dupl)
print("============================================\n")
for j in range(0,len(num_list)) :
print("{}번째 반복문".format(j+1))
print("{}번째 리스트멤버의 값은 {}".format(j+1, num_list[j]))
if num_list[j] < 0 :
print("{}는 음수이므로 복본 리스트에서 제거함.".format(num_list[j]))
num_list_dupl.remove(num_list[j]) #복본 리스트에서 음수인 멤버 제거.
print("음수 제거 후 복본 리스트 : ", num_list_dupl)
print("원본 리스트 : ", num_list)
print("============================================")
else :
print("{}는 0이상의 정수".format(num_list[j]))
print("복본 리스트 : ", num_list_dupl)
print("원본 리스트 : ", num_list)
print("============================================")
답변 1
1
안녕하세요. 이 부분은 양해를 부탁드립니다.
영상 초반에 말씀드린대로, 강의 내용에 대한 문의만 부탁을 드려요. 영상과 새소식에서도 말씀을 드렸던 부분이라서요. 새소식도 한번 확인부탁드려요. 다시한번 이 부분 양해부탁드립니다.
간단히만 리스트 원본을 복사하려면 다음과 같이 copy() 를 쓰셔도 좋습니다.
bar = [1, 2, 3]
copy_list = bar.copy()