인터프리터의 메모리에서 생성 된 변수, 함수 등을 삭제하는 방법이 있습니까?


114

나는 며칠 동안이 질문에 대한 정확한 답을 찾고 있었지만 좋은 것을 얻지 못했습니다. 나는 프로그래밍의 완전한 초보자는 아니지만 아직 중급 수준은 아닙니다.

Python의 셸에있을 때 다음을 입력합니다. dir()현재 범위 (메인 블록)에있는 모든 개체의 모든 이름을 볼 수 있으며 그중 6 개가 있습니다.

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

그런 다음 예를 들어 변수를 선언 할 때 x = 10기본 제공 모듈 아래에있는 개체 목록에 자동으로 추가되고 다시 dir()입력하면 다음과 같이 표시됩니다 dir().

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

함수, 클래스 등도 마찬가지입니다.

처음에 사용 가능한 표준 6을 지우지 않고 모든 새 개체를 삭제하려면 어떻게해야합니까?

명령 프롬프트 창에서 모든 텍스트를 지우는 "메모리 정리", "콘솔 정리"에 대해 여기에서 읽었습니다.

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

그러나이 모든 것은 내가 달성하려는 것과는 아무런 관련이 없으며 사용 된 모든 개체를 정리하지 않습니다.


2
왜 이렇게해야한다고 생각합니까? 아니면 그냥 호기심으로 묻는 것입니까?
PM 2Ring

나는 거기에 del기능 이 있다는 것을 몰랐 습니다. 저는 파이썬을 배우기 시작했고 종종 셸에서 실험해야하므로 x또는 같은 표준 변수 이름 y이 이미 사용 중이며 셸을 다시 시작하는 데 15 초가 더 걸립니다 (현재 매우 오래된 노트북이 있습니다). 그래서 저는 파이썬 메모리를 더 빨리 정리하는 방법을 찾고 싶었습니다.
funghorn 2014 년

1
아. FWIW del는 정확히 함수가 아니므로 아니요 (). del 문을 소개하는 키워드입니다. 물론 객체를 실제로 삭제하는 방법에는 기능이 포함될 수 있지만 다른 이야기입니다 ...
PM 2Ring

같은 쉘 이름에 실험을 할 때 x또는 y하지 않는 한 사용하지 않아야 당신이 그들을 사용하고 있습니다. 또는 어리석은 일을하지 않는 한 from _somemodule_ import *, 모든 종류의 쓰레기가 장소를 어지럽히 게됩니다. :)
PM 2Ring

1
이 질문에 대한 내 길을 봤는데 지금 궁금합니다. 어쨌든 모든 변수와 함수를 삭제하려면 커널을 다시 시작하고 맨 위에서 스크립트를 다시 실행할 수없는 이유는 무엇입니까?
vagabond

답변:


159

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

del x

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

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

이것은 단지 예제 루프입니다. 그것은 방어 적으로 밑줄로 시작하지 않는 이름 만 삭제하고, 통역사에서 시작 부분에 밑줄이없는 이름 만 사용했다고 가정합니다. 정말로 철저히하고 싶다면 하드 코딩 된 이름 목록을 대신 보관 (화이트리스트) 할 수 있습니다. 인터프리터를 종료하고 다시 시작하는 것 외에는 지우기를 수행하는 내장 기능이 없습니다.

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


글쎄, 나는 startswith('_')아주 순진 해 보인다고 말해야한다 . 사람이 쓸 수있는 스마트 충분한 경우 _foo=42심지어는 __foo__=42, 우리는 어떻게 이러한 삭제할 수 있습니다? 프로그래밍 방식으로 표준 모듈 속성의 이름을 얻는 방법이 있습니까?
georg

2
@georg : 루프를 방어 적으로 코딩했습니다. 더 잘하고 싶다면 유지하기 위해 초기 이름 목록을 하드 코딩해야합니다.
Martijn Pieters

그래서, 안돼? 내 생각이었다 dir(ModuleType()), 그러나 그것은 단지 반환 doc하고 name.
georg

1
@georg : 아니요; 인터프리터의 글로벌 네임 스페이스는 릴리스마다 다르며 , 이후 단계에서 인터프리터를 열었을 때 거기에 있던 내용을 열거하는 확실한 방법 (내가 알고있는)은 없습니다 .
Martijn Pieters

1
@nakE 함수와 클래스는 다른 것과 같은 객체입니다. 그들은 특별하지 않습니다. 화이트리스트를 사용하거나 클래스와 함수를 보존하는 데 필요한 객체 유형을 확인하십시오.
Martijn Pieters

67

예. iPython에서 모든 것을 제거하는 간단한 방법이 있습니다. iPython 콘솔에서 다음을 입력하십시오.

%reset

그러면 시스템에서 확인을 요청합니다. y를 누릅니다. 이 프롬프트를 보지 않으려면 다음을 입력하십시오.

%reset -f

작동합니다 ..


1
다시 한 번, 왜 이것이 최고의 대답이 아닌가?
myradio

11
@myradio IPython을 사용하지 않는 모든 사람과는 무관하기 때문에 질문에 답하지도 않습니다. 질문은 IPython 의 내용을 재설정하지 않고 전역 객체 참조를 삭제하는 방법을 묻습니다 .
Andreas

17

Python 가비지 수집기를 사용할 수 있습니다.

import gc
gc.collect()

6
안녕하세요 @Fardin! 감사! 당신의 대답은 일을했고 내 하루를 구했습니다! 그러나 gc.collect () 전에 del (variable)을 수행했습니다.
Gmosy Gnaq

9

대화 형 환경에 Jupyter있거나 원하지 않는 var 가 무거워지면 삭제하는ipython 데 관심이있을 수 있습니다 .

마법-명령 resetreset_selective같은 대화 형 파이썬 세션에 vailable이다 ipython하고Jupyter

1) reset

reset 인수없이 호출 된 경우 사용자가 정의한 모든 이름을 제거하여 네임 스페이스를 재설정합니다.

in그리고 out매개 변수를 사용하면 IN / OUT 캐시를 플러시할지 여부를 지정합니다. 디렉토리 기록은 dhist매개 변수 로 플러시됩니다 .

reset in out

또 다른 흥미로운 array점은 numpy 배열 만 제거한다는 것입니다 .

reset array

2) 재설정 _ 선택적

사용자가 정의한 이름을 제거하여 네임 스페이스를 재설정합니다. 필요한 경우 입력 / 출력 기록이 남아 있습니다.

깨끗한 어레이 예 :

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

출처 : http://ipython.readthedocs.io/en/stable/interactive/magics.html


6

이것은 나를 위해 일했습니다.

전역 및 로컬에 대해 한 번 실행해야합니다.

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

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

4

사실 파이썬은 더 이상 사용하지 않는 메모리를 회수하는데 이것을 파이썬에서 자동으로 처리하는 가비지 콜렉션 이라고 합니다. 하지만 그래도 원하는 경우 del variable_name. 변수를 다음에 할당하여 수행 할 수도 있습니다.None

a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

참조되지 않은 Python 객체에서 실제로 메모리를 회수하는 유일한 방법은 가비지 수집기를 사용하는 것입니다. del 키워드는 단순히 개체에서 이름의 바인딩을 해제하지만 개체는 여전히 가비지 수집되어야합니다. gc 모듈을 사용하여 가비지 수집기를 강제로 실행할 수 있지만 이는 거의 확실하게 조기 최적화이지만 자체 위험이 있습니다. del어차피 범위를 벗어나면 이름이 삭제 되었기 때문에 사용 은 실제 효과가 없습니다.


과연. 물론 인터프리터의 전역 네임 스페이스에서 작업 할 때 이름이 범위를 벗어나지는 않지만 그렇게됩니다. :) 나는 쓰레기 구현에 의존 수집 된 개체에서 사용하는 메모리에 발생하지만, 대부분의 파이썬 구현에 gc'ed 메모리는 단지 파이썬 풀에 다시가는 것, 그것이 있다고도 언급 할만큼 가치 같아요 되지 받는 반환 프로그램이 종료 될 때까지 OS.
PM 2Ring

@ PM2Ring LOL :) 그렇게 생각합니다. 어디에서 파이썬을 참조합니까?
디코더

2
CPython에서 GC는 참조주기를 중단하는 데만 필요합니다. 참조가 남아 있지 않으면 개체 메모리에서 제거됩니다. 그래서 del 않습니다 여기에 실제 효과가 있습니다.
Martijn Pieters

@MartijnPieters, 채소 제거? 기술 용어입니까? :)
Eryk Sun 2014

2
@eryksun : 예, 물론 RFC 4042-bis2에 정의 된대로입니다! :-P
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.