콘텐츠로 건너뛰기

리스트 컴프리핸션

제곱함수의 잘못된 구현

def my_power(list_a):
    for i in list_a:
        list_a[i]=i*i

list_a=[1,2,3]

print(my_power(list_a))        
  • 윗 코드의 문제점
    • for 문의 i는 value를 가지고 오는것을 이해하지 못한 코드
    • list_a는 리스트 자료형. 즉, 가변자료형(mutable)이다. 자기꺼를 누가 바꿔도 조용히 있으므로 … 딥러닝할 때 이렇게 바꿔버리면 원본 오염이 발생한다.

제곱함수의 구현

  • 제곱함수의 구현 1 – enumerate 사용
def my_power(list_a):
    for i, value in enumerate(list_a):
        list_a[i]=value*value
    return list_a

list_a=[1,2,3]

print(my_power(list_a))        
  • 제곱함수의 구현2 – 인덱스 값으로 리스트를 제한
def my_power(list_a):
    for i in range(len(list_a)):
        list_a[i]=list_a[i]*list_a[i]
    return list_a

list_a=[1,2,3]
print(my_power())
  • 제곱함수의 구현3 – 리스트 컴프리핸션
#리스트컴프리핸션으로 구해보자
def my_power(list_a):
    return([i*i for i in list_a])

list_a=[1,2,3]

print(my_power(list_a))

구현 3이 가장 파이썬스럽다고 한다. 코드가 읽기 쉽고, 구현1과 구현2가 원본을 오염시키는데 반하여 구현3은 원본을 오염시키지 않기 때문이다.


참조. 오염 방지를 위한 “구현1″의 변경

def my_power(list_a):
    list_b=[]
    for i, value in enumerate(list_a):
        list_b[i]=value*value
    return list_b
list_a=[1,2,3]

print(my_power(list_a))

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[15], line 8
      5     return list_b
      6 list_a=[1,2,3]
----> 8 print(my_power(list_a))

Cell In[15], line 4, in my_power(list_a)
      2 list_b=[]
      3 for i, value in enumerate(list_a):
----> 4     list_b[i]=value*value
      5 return list_b

IndexError: list assignment index out of range

이유는, list_b[]에 넣으려고 하는데 인덱스 값(메모리 영역)이 잡혀 있지 않아서다. 다음과 같이 append로 값을 넣어주어야 한다.

def my_power(list_a):
    list_b=[]
    for i, value in enumerate(list_a):
        list_b.append(value*value)
    return list_b
list_a=[1,2,3]

print(my_power(list_a))
print(list_a)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다