[python] 델파이는 언제 파이썬에서 유용합니까?

파이썬에 del키워드가 필요한 이유를 생각할 수 없습니다 (대부분의 언어에는 비슷한 키워드가없는 것 같습니다). 예를 들어 변수를 삭제하는 대신 변수를 할당 None할 수 있습니다. 사전에서 삭제할 때 del방법을 추가 할 수 있습니다.

del파이썬 에 보관해야 할 이유가 있습니까? 아니면 파이썬의 쓰레기 수거 전날의 흔적입니까?



답변

첫째, 지역 변수 외에 다른 것을 델 수 있습니다

del list_item[4]
del dictionary["alpha"]

둘 다 분명히 유용해야합니다. 둘째, del지역 변수를 사용하면 의도가 더 명확 해집니다. 비교:

del foo

foo = None

나는의 경우 알고 del foo의도 범위에서 변수를 제거하는 것입니다. 그 foo = None일이 확실하지 않습니다 . 누군가 방금 할당 한 경우 foo = None죽은 코드라고 생각할 수 있습니다. 그러나 나는 코드 del foo를 작성하는 사람이 무엇 을하려고 하는지 즉시 알고 있습니다.


답변

파이썬 언어 레퍼런스 (Python Language Reference ) del의 기능 중 일부는 다음과 같습니다.

이름을 삭제하면 로컬 또는 글로벌 네임 스페이스에서 해당 이름의 바인딩이 제거됩니다.

None이름을 할당 해도 네임 스페이스에서 이름의 바인딩이 제거되지 않습니다.

(이름 바인딩을 제거하는 것이 실제로 유용한 지에 대한 논쟁이있을 수 있지만 다른 질문입니다.)


답변

내가 찾은 del유용한 곳 중 하나 는 for 루프에서 외부 변수를 정리하는 것입니다.

for x in some_list:
  do(x)
del x

for 루프 외부에서 x를 사용하면 x가 정의되지 않을 것입니다.


답변

변수를 삭제하는 것은 없음으로 설정하는 것과 다릅니다

변수 이름을 삭제 del하면 거의 사용되지 않지만 키워드가 없으면 사소하게 달성 할 수 없습니다. 을 작성하여 변수 이름을 만들 수 있다면 a=1이론적으로 a를 삭제하여이를 취소 할 수 있습니다.

삭제 된 변수에 액세스하려고하면 NameError가 발생하기 때문에 경우에 따라 디버깅이 더 쉬워 질 수 있습니다.

클래스 인스턴스 속성을 삭제할 수 있습니다

파이썬을 사용하면 다음과 같은 것을 작성할 수 있습니다.

class A(object):
    def set_a(self, a):
        self.a=a
a=A()
a.set_a(3)
if hasattr(a, "a"):
    print("Hallo")

클래스 인스턴스에 속성을 동적으로 추가하기로 선택한 경우 반드시 작성하여 취소 할 수 있습니다.

del a.a


답변

예외를 검사하는 데 사용할 때 사용해야하는 특정 예가 있습니다 del(다른 사람이있을 수도 있지만이 정보를 알고 sys.exc_info()있음). 이 함수는 튜플, 발생한 예외 유형, 메시지 및 역 추적을 리턴합니다.

처음 두 값은 일반적으로 오류를 진단하고 조치를 취하기에 충분하지만 세 번째 값은 예외가 발생한 위치와 예외가 발생한 위치 사이의 전체 호출 스택을 포함합니다. 특히, 당신이 같은 것을하면

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

역 추적 tb은 호출 스택의 로컬에서 끝나며 가비지 수집 할 수없는 순환 참조를 만듭니다. 따라서 다음을 수행하는 것이 중요합니다.

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

순환 참조를 끊습니다. sys.exc_info()메타 클래스 매직과 같이을 호출하려는 많은 경우에 역 추적 (traceback) 유용하므로 예외 핸들러를 떠나기 전에이를 정리해야합니다. 역 추적이 필요하지 않은 경우 역 추적을 즉시 삭제하거나 다음을 수행해야합니다.

exc_type, exc_value = sys.exc_info()[:2]

모두 함께 피하십시오.


답변

또 다른 생각.

Django와 같은 프레임 워크에서 http 응용 프로그램을 디버깅 할 때 이전에 사용 된 쓸모없고 엉망이 된 변수로 가득 찬 호출 스택, 특히 매우 긴 목록 인 경우 개발자에게는 매우 고통 스럽습니다. 따라서이 시점에서 네임 스페이스 제어가 유용 할 수 있습니다.


답변

변수를 없음에 할당하는 것보다 “del”을 명시 적으로 사용하는 것이 좋습니다. 존재하지 않는 변수를 찾으려고하면 런타임 오류가 발생하지만 존재하지 않는 변수를 None으로 설정하려고하면 Python은 자동으로 새 변수를 None으로 설정하여 변수를 남겨 둡니다. 원래 있던 곳을 삭제하고 싶었습니다. 델은 실수를 미리 잡을 수 있도록 도와 줄 것입니다.