[Trouble Shooting][Python] 리스트 clear() 함수 사용 시 주의사항

·2023년 3월 21일
0

[Trouble Shooting]

목록 보기
4/8
post-thumbnail

문제 상황

  • 딕셔너리 키에 리스트 타입의 데이터를 입력했지만 출력 시 모든 key의 value 값이 마지막 key의 value로 출력됨

문제 코드

dics = {}
divisor = []
for i in range(1, 11):
    divisor.clear()

    for j in range(1, i + 1):
        if i % j == 0:
            divisor.append(j)

    dics[i] = divisor

print(dics)
💡result

{1: [1, 2, 5, 10], 2: [1, 2, 5, 10], 3: [1, 2, 5, 10], 4: [1, 2, 5, 10], 5: [1, 2, 5, 10], 6: [1, 2, 5, 10], 7: [1, 2, 5, 10], 8: [1, 2, 5, 10], 9: [1, 2, 5, 10], 10: [1, 2, 5, 10]}

문제 분석

  • divisor.clear()과 divisor=[ ] 의 차이를 파악하지 못해 발생한 문제

위 코드를 보면 첫번째 for문을 반복 시 divisor 리스트를 clear() 해준다.

기대한 결과는 리스트의 모든 값이 삭제된 후 새로운 데이터를 추가한 리스트를 새로운 딕셔너리 key의 value로 추가하는 것이다.

하지만 clear() 함수는 기존 리스트 즉, 레퍼런스 변수의 값을 삭제하는 것이므로

dics[i] = divisor 

위 코드를 통해 dvisor 리스트를 참조한 모든 데이터의 값도 clear() 된다.

  • 쉽게말해 clear() 함수를 통해 데이터를 삭제한 경우 이전에 리스트 데이터를 저장한 모든 변수의 데이터도 삭제된다.

리스트의 ID를 확인하면 쉽게 이해할 수 있다


divisor = []
print(f' divisor \t\t\tID: {id(divisor)}')
divisor.clear()
print(f' divisor.clear() \tID: {id(divisor)}')
 divisor 			ID: 2286898901568 
 divisor.clear() 	ID: 2286898901568 #동일

divisor.clear() 실행 후에도 divisor의 ID는 동일하기 때문에 리스트를 참조한 모든 변수의 값도 삭제된다.

에러 해결

  • 리스트에 새로운 데이터를 넣고 싶다면 clear() 말고 초기화를 하자

divisor = []
print(f' divisor \t\t\tID: {id(divisor)}')
divisor.clear()
print(f' divisor.clear() \tID: {id(divisor)}')
divisor = []
print(f' divisor = [] \t\tID: {id(divisor)}')
 divisor 			ID: 2286898901568
 divisor.clear() 	ID: 2286898901568 #동일
 divisor = [] 		ID: 2286898868288 #다름

  • 코드 수정
for i in range(1, 11):
    divisor = []
    # divisor.clear()

    for j in range(1, i + 1):
        if i % j == 0:
            divisor.append(j)

    dics[i] = divisor

print(dics)


profile
개발하고싶은사람

0개의 댓글