파이썬에서 변수 지우기


답변:


157

무슨 일이야 self.left = None?


19
None 키워드에 익숙하지 않습니다. 다른 언어의 null과 비슷합니까?
Bnicholas

6
예; null과 같습니다.
Smashery

12
@Bnicholas 그러나 nullPHP에서는 그렇지 않습니다 . PHP에서 변수를 설정 null하면 처음에 정의하지 않은 것처럼 대부분의 경우 비슷한 동작을 제공합니다. None파이썬에서 값은 정의되지 않은 변수와는 다릅니다. 그러나 None다른 대부분의 화신과 매우 흡사합니다 null(적어도 더 자세한 세부 정보를 얻을 때까지).

키워드가 아닙니다. 내장 객체의 기본 이름입니다. 당신은 무엇이든 할 수있는 None당신이 지정되지 않은 유형의 다른 "일반"개체와 함께 할 수있는 : 그것의 문자열 표현을 인쇄, 저장, 그 용기에 그것에 몇 가지 메타 데이터를 확인을 ... 어쨌든, 당신은 "파이썬 널 위해 구글을 시도 않았다 동등한"? 나는 진지하다. 약간의 분석이 필요하지만 정보는 바로 거기에 있습니다.
Karl Knechtel

18
파이썬 터미널을 열고 입력 print x하고 Enter 키를 누릅니다. 정의되지 않은 변수를 인쇄하려고 할 때 대부분의 언어와 마찬가지로 인터프리터 오류가 발생합니다. 그러나 변수를 정의한 다음 없음으로 지우려고하면 print x코드를 사용하여 단어 None를 출력으로 생성합니다 . 나는 파이썬에 익숙하지 않아서 착각 할 수는 있지만 이것은 지워진 변수의 행동처럼 보이지 않습니다.
Musixauce3000

407

del키워드는 할 것입니다.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

하지만이 경우에 투표 self.left = None


18
때로는 이것이 완전히 제거되지는 않지만 메모리의 해당 참조 만 제거합니다. 이것은 유령 변수를 메모리에 남겨두고 gc를 얻지 못할 수 있습니다.
Jakob Bowyer

4
del존재하지 않는 변수를 삭제하려고하면 예외가 발생한다는 단점이 있습니다 . 일반적으로 바람직하지 않습니다.
Philip Kearns

33
실수로 명령에 내장 된 명령을 덮어 쓰는 변수를 실수로 선언 한 경우 type=… 입력 type(…)한 다음 삭제하는 것이 원래 기능을 다시 얻는 가장 쉬운 방법 이라는 것을 지적하고 싶었습니다 . 즉, None으로 유지하면 기본 기능에 대한 액세스가 여전히 차단됩니다.
mpacer

1
가비지 수집 / 수집기 / 수집
mccc

1
이것은 내가 찾던 것입니다. cmd 줄에서 재생하면 ...이 set = set(myList)있고 더 이상 set을 함수 (doh)로 사용할 수 없다는 것을 알았습니다. 사용 del set나를 FX로 다시 사용하는 것을 허용했다. 물론 실제 스크립트에서 예약 된 var를 사용하지는 않습니다.
jbchurchill

111

var = None "값을 지우고"변수 값을 "없음"과 같이 "널"로 설정하지만 변수에 대한 포인터는 그대로 유지됩니다.

del var 변수에 대한 정의를 완전히 제거합니다.

나중에 변수를 사용하려면 새 값을 설정하십시오. 즉, 변수를 유지하는 None것이 좋습니다.


어떤 상황에서는 존재하지 않는 변수를 완전히 삭제하려면 어떻게해야합니까? 오류를 피하기위한 매개 변수가 있습니까? 여러 변수를 삭제해야합니다 : del a, b, c, d 루프를 사용하고 시도 / 제외 할 수는 있지만 피하기 위해 스위치를 선호합니다.
Tedo Vrbanec

63

실제로는 변수 / 속성을 삭제하지 않습니다. 값을로 설정 None하면 변수가 여전히 메모리의 공간을 차지합니다. 메모리에서 변수의 모든 존재를 완전히 지우려면 다음을 입력하십시오.

del self.left

8
= None 답변이 왜 그렇게 대중적인지 이해할 수 없습니다. 정답입니다
Nikolay Gromov

1
OP는 clear그렇지 않다고 말했다 remove. del은 속성과 조회를 종료합니다. 확인할 수있는 것보다 None으로 설정하는 것이 더 깔끔 if self.left하며 노드가 비어 있는지 확인하기에 충분합니다.
user1767754

"None으로 설정하는 것이 더 깔끔하다"-누군가 (나중에 또는 공동 작업자가) 코드를 읽고 del있다면 IMHO는 '정신적으로 파싱 할 때 변수를 잊어 버릴 수 있음을 더욱 분명하게 고려할 가치가 있다. ' 코드.
Pocketsand

1
self.left의 값을 얻으려는 일상 코드의 @NikolayGromov는 check if self.left:을 선호합니까? 아니면 어디서나 처리하지 않으면 프로그램을 중단시킬 수있는 NameError 예외를 처리하는 것을 선호합니까? ?
Pierre.Sassoulas

33
  • 희망이 할 경우 완전히 삭제는 사용 del:

    del your_variable

  • 또는 그렇지 않으면하는 값을 확인합니다None :

    your_variable = None

  • 그것이 만약 반복 가능한 (예 : 목록 또는 튜플 등)을, 당신은 같은 비울 수 있습니다 :

    your_variable.clear()

그런 다음 your_variable비어있을 것입니다


두 번째 옵션 인 "컨텐츠 지우기"가 올바르지 않은 경우 변수를 없음으로 만 재 할당합니다. 원래 개체는 그대로 유지됩니다 (가비지 수집 된 경우 참조 카운트가 0으로 감소하지 않는 한).
cs95

0

변수를 삭제 하시겠습니까?

좋아, 나는 @bnul 답변에 가장 좋은 대안 아이디어가 있다고 생각한다.

다음을 사용하여 개별 이름을 삭제할 수 있습니다 del.

del x 또는 globals () 객체에서 제거 할 수 있습니다.

for name in dir(): if not name.startswith('_'): del globals()[name]

이것은 예제 루프 일뿐입니다. 그것은 밑줄로 시작하지 않는 이름 만 방어 적으로 삭제하고, 당신이 인터프리터에서 시작할 때 밑줄없이 이름 만 사용했다고 가정합니다. 당신이 정말로 철저히 원한다면 하드 코딩 된 이름 목록을 사용하여 대신 (허용 목록) 유지할 수 있습니다. 통역사를 종료하고 다시 시작하는 것 외에는 사용자를 위해 정리를 수행하는 내장 기능이 없습니다.

가져온 모듈 (import os)은 sys.modules에서 참조하기 때문에 가져온 상태로 유지됩니다. 후속 가져 오기는 이미 가져온 모듈 객체를 재사용합니다. 현재 글로벌 네임 스페이스에 대한 참조가 없습니다.

이 답변을 재고하십시오!


-1

위에서 언급 한 몇 가지 옵션을 사용했습니다.

del self.left

또는 사용하여 값을 없음으로 설정

self.left = None

값을 없음으로 설정할 때 차이점을 알고 몇 가지 예외 처리기를 배치하는 것이 중요합니다. 템플릿을 사용하여 조건 문의 값을 인쇄하는 경우

print("The value of the variable is {}".format(self.left))

변수 인쇄 값 "변수 값이 없음"으로 표시 될 수 있습니다. 따라서 몇 가지 예외 처리기를 거기에 배치해야합니다.

if self.left:
    #Then only print stuff

위의 명령은 self.left가 아닌 경우에만 값을 인쇄합니다 None

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.