파이썬 del 이 함수인가요?

조회수 3564회

함수를 호출할 때 함수명(매개변수) 이렇게 호출하는데 파이썬에서 deldel 객체로 사용합니다. 책에서 del을 함수라고 하는데 del은 함수 사용법이 다른 건가요? 아님 함수가 아닌 다른 무언가인가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • del 표현연산자이자 키워드이며 변수를 제거(1)하거나 객체의 요소를 삭제하는 함수를 호출(2)합니다.

    GC(가비지 컬렉터)와 레퍼런스 카운트에 대해 들어본 적이 있으신지 모르겠습니다.

    foo1 = Foo() # Foo 객체를 생성하고 foo1 변수가 참조하게 함.
    # Foo 객체의 레퍼런스 카운트는 1
    foo2 = foo1 # foo1이 참조하는 것을 foo2 변수도 참조하게 함.
    # 레퍼런스 카운트는 2
    del foo1 # foo1 변수를 제거함. (주의 : Foo 객체를 제거하는 것이 아님!)
    # 레퍼런스 카운트는 1
    del foo2 # foo2 변수를 제거함.
    # 레퍼런스 카운트는 0
    # GC가 Foo 객체를 곧 삭제할 예정!
    

    이러한 것인데 보통은 del을 명시적으로 해주지 않아도 변수가 함수 스코프를 벗어나면 자동으로 제거되어 레퍼런스 카운트가 줄어듭니다.
    (1) 용례에서의 del은 그것을 명시적으로 해주는 역할을 하게 됩니다.
    이때는 사실 함수라고 부르긴 애매하고 연산자라고 부르는 것이 더 좋습니다.

    (2) 용례에서는 그래도 함수라고 부를 수 있습니다.

    class Foo(object):
        def __delitem__(self, key): # del obj[key]가 호출하는 함수
            print(str(key)) # 보통은 key에 해당하는 내부 요소를 삭제합니다.
    
    foo = Foo()
    del foo[42] # 42를 출력. foo.__delitem__(42)와 동일
    del foo["hi"] # hi를 출력. foo.__delitem__("hi")와 동일
    

    함수인 것은 아니지만 함수를 호출하니까 함수라고 부를 수 있는 것이죠.
    __delitem__을 호출하는 문법적 설탕이라고 보시면 됩니다.

    사족으로 넓은 의미에서 함수는 x를 주면 연산하여 y를 뱉는 것이라면 모두 함수라고 볼 수 있어서 문법상으로 함수가 아니더라도 함수라고 부르는 경우가 있습니다.
    (1) 용례의 del에서 x는 변수이고 연산은 변수를 제거한다이며 y는 아무것도입니다.
    (2) 용례의 del에서 x는 객체와 키이고 연산은 객체에서 키에 해당하는 요소를 제거한다이며 y는 역시 아무것도입니다.
    이러한 관점에서는 함수라고 부를 수 있긴 합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)