Python 스크립트 중간에있는 모든 변수를 지우려면 어떻게해야합니까?


85

Matlab의 'clear'와 비슷한 것을 찾고 있습니다. 작업 공간에서 모든 변수를 제거하고 시스템 메모리에서 해제하는 명령 / 함수입니다. 파이썬에 그런 것이 있습니까?

편집 : 어느 시점에서 모든 변수를 지우는 스크립트를 작성하고 싶습니다.


2
제목을 "Python 스크립트 중간에있는 모든 변수를 지우려면 어떻게해야합니까?"와 같이 제목을 변경하면 도움이됩니다. "Python에서 명령 창을 다시 시작하는 방법"때문에 주제에 대한 향후 검색을 위해 실제로 요청하는 것과는 아무 관련이 없습니다.
Sam Dolan

이것이 의미가있는 가능한 컨텍스트를 제공 할 수 있습니까?
S.Lott

2
코딩 습관을 네이티브 환경에서 말이되지 않는 환경으로 옮기려는 또 다른 사례처럼 들립니다.
Glenn Maynard

거대한 물체 (이미지 또는 기타 거대한 배열)에 관심이 있다면 del작업을 마쳤을 때 할 수 있습니다. 단순히 네임 스페이스가 복잡 해지는 것이 걱정된다면 너무 많은 이름을 사용하여 디자인을 재고해야 할 것입니다. 예를 들어 일련의 이미지 변환의 경우 모든 중간 단계를 유지하는 것은 불필요 할 수 있습니다.
Nick T

3
@ S.Lott : 콘솔의 탐색 적 과학적 분석. 원하지 않는 변수가 많이 발생하는 것이 일반적입니다 (일을 시도한 후 관련 경로가 아닌 것으로 판단한 후). 그러나이 경우 John La Rooy의 대답 이 가장 적절합니다.
naught101

답변:


69

다음 명령 시퀀스 는 현재 모듈에서 모든 이름을 제거 합니다.

>>> import sys
>>> sys.modules[__name__].__dict__.clear()

"모든 이름"에는 모든 내장 기능이 포함되어 있기 때문에 실제로이 작업을 수행하고 싶지 않은 것 같습니다. 따라서 이러한 전체 삭제 후에 수행 할 수있는 작업이 많지 않습니다. 파이썬에는 실제로 "변수"와 같은 것이 없습니다. 많은 종류의 객체 (모듈, 함수, 클래스, 숫자, 문자열, ... 포함)가 있고 객체에 바인딩 된 이름 이 있습니다. 시퀀스가하는 일은 모듈에서 모든 이름을 제거하는 것입니다 (해당 객체는 해당 객체에 대한 모든 참조가 방금 제거 된 경우에만 사라집니다).

좀 더 선택적이고 싶을 수도 있지만 더 구체적으로 말하고 싶지 않으면 정확히 무슨 뜻인지 추측하기가 어렵습니다. 그러나 예를 들면 다음과 같습니다.

>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
...   if n[0]!='_': delattr(this, n)
... 
>>>

이 시퀀스는 __builtins__모든 내장 이름을 포함하는 특수 이름을 포함하여 비공개 또는 마법의 이름 만 남깁니다 . 따라서 내장 기능은 여전히 ​​작동합니다.

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 

보시다시피 이름 n(그 안에있는 제어 변수 for)도 주변에 붙어 있기 때문에 ( for매번 절 에 다시 바인딩 되므로) 제어 변수의 이름을 지정하는 것이 좋습니다. _예를 들어 "그것은 special "(플러스, 인터랙티브 인터프리터에서 이름 _은 프롬프트에 입력 된 모든 완전한 표현 후에 그 표현의 값에 다시 바인딩되므로 오래 머 무르지 않을 것입니다 ;-).

당신이 정확히 무엇을 결정했으면 어쨌든, 이다 당신이 원하는, 그것은 목적 함수를 정의하고 ((만 대화 형 세션에서 원하는 경우) 시작 파일에 넣어 또는 사이트 사용자 정의 파일 어렵지 않다 모든 스크립트에서 원하는 경우).


2
글쎄요 당신은 시작시 항상 원본 사전의 사본을 보관하고 추가 된 이름을 제거 할 수 있습니다.) 그러나 이것은 동적 시스템의 명백한 남용이라고 생각하며 이것을 수행하는 데 무의미한 상황을 생각할 수 없습니다 in.
monoceres

5
하하, 이것은 이렇게 당신이 잃을 얼마나 많은 기능 놀라운 ... 화려한이며, 아직 얼마나 많은 기능 당신은 같은 물건을 수행하여 다시 얻을 수있는 int = (2).__class__, str = ''.__class__, True = (1 == 1)... 등
Chinmay Kanchi

@monoceres, 사본의 이름을 어떻게 지정하고 어디에서 숨길까요?-)
Alex Martelli

2
파이썬을 더 많이 사용할수록 더 좋아합니다. 그것은 훌륭한 언어 일뿐만 아니라 단순히 그것을 만지작 거리고 당신이 정말로하지 말아야 할 일을하도록 만드는 데 시간을 보낼 수 있습니다 ;-)
Chinmay Kanchi

1
아마도 잘못된 방법으로 얻었을 수도 있지만 한 가지 문제에 직면 for n in dir(): ... if n[0]!='_': delattr(this, n)했습니다. 언젠가 사용 n=this하고 루프에서 삭제할 때! 따라서 다음 반복에서 delattr(this,n)방금 삭제했기 때문에 오류 시도 중입니다 ! :) 그래서 제대로 작동하지 않습니다
Mikhail_Sam

60

아니요, 통역사를 다시 시작하는 것이 가장 좋습니다.

IPython 은 번들로 제공되는 인터프리터의 훌륭한 대체품 %reset이며 일반적으로 작동 하는 명령이 있습니다.


1
'아니오'라는 말은 내가하면 안된다는 뜻인가요, 아니면 불가능하다는 뜻인가요? 하지 말라고하면 이유를 설명해 주 시겠어요?
snakile

6
1 : 그것은 나를 위해 두 번째의 1/4 걸리지 ctrl-d다음 pyt-> tab통역으로 돌아가는 데. 여기서 멋진 일을 할 이유가 없습니다.
Sam Dolan

3
% reset은 대부분의 변수에서 작동하지만 일부는 그렇지 않습니다. 저에게는 통역사를 다시 시작하는 것만으로 모든 것이 청소됩니다.
artemis_clyde

3
%reset -f비대화 형으로 사용 합니다. stackoverflow.com/questions/38798181/…
Joachim Wagner

27

함수를 작성하면 일단 그대로두면 모든 이름이 사라집니다.

이 개념은 네임 스페이스 라고 불리며 매우 훌륭해서 Zen of Python이되었습니다 .

네임 스페이스는 멋진 아이디어 중 하나입니다. 더 많은 작업을 수행해 보겠습니다!

IPython의 네임 스페이스도 마찬가지로 magic 명령으로 재설정 할 수 있습니다 %reset -f. ( -f이는 "강제"를 의미합니다. 즉, "정말 모든 변수를 삭제할 것인지 묻지 말고 그냥 실행하십시오.")


분명한 점을 추가하겠습니다. 모든 것을 주요 기능 (가져 오기 포함)에 넣으면 실제로는 해당 기능을 종료하여 재설정 할 수있는 작업장을 얻게됩니다. 나는 그것이 실제로 질문이 의도 한 것이라고 믿습니다.
David

8
from IPython import get_ipython;   
get_ipython().magic('reset -sf')

3
한 번 봐 제발 답변하는 방법
아도니스

1
또는 간단히%reset -sf
सत्यमेव जयते

1
실제로 % reset -sf 명령은 아나콘다 프롬프트로 파이썬 스크립트를 실행할 때 작동하지 않고 오류를 발생시킵니다 (try- except를 사용한 경우에도 작동하지 않습니다). 당신은 똑같이 시도 할 수 있고 당신은 보게 될 것입니다. 그러나 ipython 라이브러리를 사용하면 가능한 모든 경우에이 문제를 해결할 수 있습니다.
Anurag Gupta

5

이것은 Alex의 대답의 수정 된 버전입니다. 다음 두 가지 방법을 사용하여 모듈의 네임 스페이스 상태를 저장하고 복원 할 수 있습니다.

__saved_context__ = {}

def saveContext():
    import sys
    __saved_context__.update(sys.modules[__name__].__dict__)

def restoreContext():
    import sys
    names = sys.modules[__name__].__dict__.keys()
    for n in names:
        if n not in __saved_context__:
            del sys.modules[__name__].__dict__[n]

saveContext()

hello = 'hi there'
print hello             # prints "hi there" on stdout

restoreContext()

print hello             # throws an exception

saveContext ()를 호출하기 전에 "clear = restoreContext"줄을 추가 할 수도 있으며 clear ()는 matlab의 clear처럼 작동합니다.


1
좋은 대답입니다! 나는 Python 3의 경우 restoreContext를 조정하고 싶을 것이라고 믿습니다.names = list(sys.modules[__name__].__dict__.keys()) 경우 . 그렇지 않으면 파이썬은 dict_keys객체 를 반복하는 동안 사전 크기를 변경했다고 불평 합니다.
Sam Bader

또한 import이 답변 을 원하는 사람들 (예 : 이것을 저장하고 숙제 과제의 다른 문제 사이의 네임 스페이스를 지우기 위해 Jupyter 노트북에서 가져옵니다) "__main__"대신 을 사용하고 싶을 것입니다 __name__.
Sam Bader 2016 년

3

Spyder에서 각 Python 파일에 대한 IPython 콘솔을 구성하여 Menu에서 각 실행 전에 모든 변수를 지울 수 Run -> Configuration -> General settings -> Remove all variables before execution있습니다.


2

globals()함수는 키가 이름을 지정할 수있는 객체의 이름 인 사전을 반환합니다 (그리고 값 id은 이러한 객체의 s입니다). exec()함수는 문자열을 가져 와서 마치 파이썬 콘솔에 입력 한 것처럼 실행합니다. 그래서 코드는

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))

이 코드 스 니펫은 질문을 해결할 수 있지만 설명포함하면 응답의 품질을 개선하는 데 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다.
Stefan Crain

감사합니다. 이제 더 낫습니까?
Kolay.Ne

0

유휴 IDE에는 Shell / Restart Shell이 ​​있습니다. Cntrl-F6이이를 수행합니다.


0

필요한 모든 변수를 포함하는 클래스를 만드는 가장 쉬운 방법이 아닙니까? 그런 다음 모든 curretn 변수를 가진 하나의 개체가 있고 필요한 경우이 변수를 덮어 쓸 수 있습니까?

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