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.