파이썬에서 델은 언제 유용합니까?
이 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
하려고 했어요
이 부분이 있는데del
(Python Language Reference에서):
이름을 삭제하면 로컬 또는 글로벌 네임스페이스에서 해당 이름의 바인딩이 제거됩니다.
「」의 할당None
이름을 지정해도 이름공간에서 이름의 바인딩은 제거되지 않습니다.
(이름 바인딩을 삭제하는 것이 실제로 도움이 되는지에 대해서는 논란이 있을 수 있지만, 그건 또 다른 질문입니다.)
찾은 은 딱 하나야del
루프에 대한 이 편리합니다.
for x in some_list:
do(x)
del x
이제 for 루프 밖에서 x를 사용하면 x가 정의되지 않음을 확인할 수 있습니다.
변수 삭제는 없음으로 설정하는 것과 다릅니다.
삭제 중 " " " " 가 붙은 변수 이름 삭제del
아마 거의 사용되지 않을 것입니다만, 키워드가 없으면 3회적으로 달성할 수 없는 것입니다.하려면 , 「 」를 합니다.a=1
a를 수 있는
삭제된 변수에 액세스하려고 하면 NameError가 발생하기 때문에 경우에 따라서는 디버깅이 쉬워집니다.
클래스 인스턴스 속성을 삭제할 수 있습니다.
Python을 사용하면 다음과 같은 것을 쓸 수 있습니다.
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()
예외를 검사합니다.이 함수는 발생한 예외 유형, 메시지 및 트레이스백을 반환합니다.
보통 처음 2개의 값은 오류를 진단하고 처리하기에 충분하지만, 세 번째 값은 예외가 발생한 위치와 예외가 검출된 지점 사이의 콜스택 전체를 포함합니다.특히 이런 걸 하면
try:
do_evil()
except:
exc_type, exc_value, tb = sys.exc_info()
if something(exc_value):
raise
"trace back" (트레이스백)tb
는 콜 스택의 로컬에 도달하여 가비지를 수집할 수 없는 순환 참조를 작성합니다.따라서 다음 작업을 수행하는 것이 중요합니다.
try:
do_evil()
except:
exc_type, exc_value, tb = sys.exc_info()
del tb
if something(exc_value):
raise
순환 참조를 깨는 것입니다..sys.exc_info()
메타클래스 매직과 마찬가지로 트레이스백은 편리하기 때문에 예외 핸들러를 떠나기 전에 반드시 트레이스백을 청소해야 합니다.트레이스 백이 필요 없는 경우는, 즉시 삭제하거나, 다음의 조작을 실시해 주세요.
exc_type, exc_value = sys.exc_info()[:2]
다 같이 피하려고.
그냥 다른 생각일 뿐이야.
Django와 같은 프레임워크에서 http 응용 프로그램을 디버깅할 때, 특히 리스트가 매우 긴 경우, 이전에 사용된 쓸모없고 엉망인 변수들로 가득 찬 콜 스택은 개발자들에게 매우 고통스러울 수 있습니다. 따라서 이 시점에서 네임스페이스 제어가 유용할 수 있습니다.
변수를 없음에 할당하는 것보다 "del"을 명시적으로 사용하는 것이 더 좋습니다.존재하지 않는 변수를 삭제하려고 하면 런타임 오류가 발생하지만 존재하지 않는 변수를 None으로 설정하려고 하면 Python은 새 변수를 None으로 자동 설정하여 원하는 변수를 삭제한 상태로 둡니다.그래서 델은 당신의 실수를 더 일찍 발견하도록 도와줄 것이다.
에 몇 하려면:del x
의의의 x
r -> o
자료r
o
단 )의 개요,del x
사항 ''"r
보다는o
. 이 조작은 오브젝트에 대한 참조(포인터)에 대한 조작으로, 에 관련지어져 있는 오브젝트가 아닙니다.x
·의 구별r
그리고.o
여기서 핵심입니다.
- 에서 제거한다.
locals()
. - 에서 삭제합니다.
globals()
한다면x
거기에 속합니다. - 스택 프레임에서 삭제합니다(참조를 물리적으로 삭제하지만 개체 자체는 스택 프레임이 아닌 개체 풀에 있습니다).
- 현재 범위에서 제거합니다.로컬 변수의 정의 범위를 제한하면 매우 유용합니다. 그렇지 않으면 문제가 발생할 수 있습니다.
- 콘텐츠의 정의라기보다는 이름 선언에 더 가깝습니다.
- 어디에 영향을 미치다
x
소속지, 소재지가 아니다x
가리키고 있습니다.메모리의 물리적 변화는 이것뿐입니다.예를 들어,x
사전 또는 목록에 있습니다(참조로서) 여기서 삭제됩니다(오브젝트 풀에서 반드시 삭제되는 것은 아닙니다).이 예에서는 소속된 딕셔너리가 스택프레임입니다(locals()
)와 겹칩니다.globals()
.
del
에서 자주 볼 수 있다__init__.py
files. 에 정의되어 있는 모든 글로벌 변수__init__.py
파일이 자동으로 "삭제"됩니다(파일은 다음 파일에 포함됩니다).from module import *
이를 회피하는1가지 방법은 다음과 같습니다.__all__
하지만 이것은 지저분해질 수 있고 모든 사람이 그것을 사용하는 것은 아니다.
예를 들어, 에 코드가 있는 경우__init__.py
맘에 들다
import sys
if sys.version_info < (3,):
print("Python 2 not supported")
그러면 모듈이 다음 명령을 내보냅니다.sys
이름을 대신 쓰세요.
import sys
if sys.version_info < (3,):
print("Python 2 not supported")
del sys
찾았다del
Numpy로 대용량 데이터를 처리할 때 의사 수동 메모리 관리에 유용합니다.예를 들어 다음과 같습니다.
for image_name in large_image_set:
large_image = io.imread(image_name)
height, width, depth = large_image.shape
large_mask = np.all(large_image == <some_condition>)
# Clear memory, make space
del large_image; gc.collect()
large_processed_image = np.zeros((height, width, depth))
large_processed_image[large_mask] = (new_value)
io.imsave("processed_image.png", large_processed_image)
# Clear memory, make space
del large_mask, large_processed_image; gc.collect()
이것은 Python GC가 따라가지 못할 때 시스템이 미친 듯이 스와프할 때 스크립트를 정지시키는 것과 동작하는 동안 머신을 브라우즈 및 코드화할 수 있는 충분한 여유 공간을 남겨둔 메모리 임계값 아래에서 완벽하게 부드럽게 실행되는 것과는 차이가 있을 수 있습니다.
numpy.load를 사용한 후 파일을 강제로 닫습니다.
아마도 틈새에서 사용하는 방법일 수도 있지만 파일을 읽을 때 유용하다는 것을 알게 되었습니다.가끔 파일을 업데이트하고 같은 이름의 파일을 디렉토리에 복사해야 합니다.
나는 사용했다del
파일을 공개하고 새 파일에 복사할 수 있습니다.
주의: 이 명령어를 사용하지 않도록 합니다.with
콘텍스트 매니저가 커맨드 라인의 플롯을 가지고 노는 동안 탭을 많이 누르고 싶지 않았기 때문에!
이 질문을 보세요.
나는 변수 설정 사이의 뉘앙스를 강조하기 위해 받아들여진 답변에 대해 자세히 설명하고 싶다.None
를 사용하여 제거할 수 없습니다.del
:
주어진 변수foo = 'bar'
및 다음 함수의 정의:
def test_var(var):
if var:
print('variable tested true')
else:
print('variable tested false')
처음 선언한 후에는test_var(foo)
수율variable tested true
역시나
이제 시도해보십시오.
foo = None
test_var(foo)
그 결과variable tested false
.
이 동작을 다음 동작과 비교:
del foo
test_var(foo)
그래서 이제NameError: name 'foo' is not defined
.
예를 들면,del
다음과 같은 경우에 사용할 수 있습니다.
def f(a, b, c=3):
return '{} {} {}'.format(a, b, c)
def g(**kwargs):
if 'c' in kwargs and kwargs['c'] is None:
del kwargs['c']
return f(**kwargs)
# g(a=1, b=2, c=None) === '1 2 3'
# g(a=1, b=2) === '1 2 3'
# g(a=1, b=2, c=4) === '1 2 4'
이 두 함수는 다른 패키지/모듈에 있을 수 있으며 프로그래머는 어떤 default value 인수를 알 필요가 없습니다.c
에f
실제로 있다.따라서 kwargs를 del과 조합하여 사용하면 "I want the default value on c"를 "None"으로 설정할 수 있습니다(이 경우 none으로 합니다).
다음과 같은 방법으로 동일한 작업을 수행할 수 있습니다.
def g(a, b, c=None):
kwargs = {'a': a,
'b': b}
if c is not None:
kwargs['c'] = c
return f(**kwargs)
하지만 나는 앞의 예가 더 건조하고 우아하다고 생각한다.
python에서 del은 언제 유용합니까?
슬라이스 구문 대신 어레이의 단일 요소를 제거하는 데 사용할 수 있습니다.x[i:i+1]=[]
이 기능은 예를 들어 에 있는 경우에 도움이 될 수 있습니다.os.walk
디렉토리내의 요소를 삭제합니다.나는 이것에 유용한 키워드는 고려하지 않을 것이다. 왜냐하면 사람은 단지 하나의 키워드를 만들 수 있기 때문이다.[].remove(index)
).remove
메서드(Method)
del이 독자적인 구문을 가지고 있는 이유 중 하나는 del이 참조하는 값이 아닌 바인딩이나 변수에 따라 동작하기 때문에 경우에 따라서는 함수를 대체하기가 어려울 수 있기 때문이라고 생각합니다.따라서 del의 함수 버전을 작성하려면 컨텍스트를 전달해야 합니다.del foo는 globals().remove('foo') 또는 locals().remove('foo')가 되어야 합니다.이것이 지저분하고 읽기 어려워집니다.그래도 델을 없애는 건 좋은 방법인 것 같아요. 겉으로 보기엔 드물지만요.그러나 언어의 특징/발톱을 제거하는 것은 고통스러울 수 있습니다.아마도 python 4는 그것을 제거할 것이다:)
"del" 명령어는 다음과 같이 배열 내의 데이터를 제어하는 데 매우 유용합니다.
elements = ["A", "B", "C", "D"]
# Remove first element.
del elements[:1]
print(elements)
출력:
['B', 'C', 'D']
del
는 변수와 해당 변수가 가리키는 개체의 바인딩을 삭제합니다.
>>> a = ['a', 'b', 'c']
>>> b = a
>>> del a
>>> b
['a', 'b', 'c']
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
간단한 사용 사례는 빌트인 함수 이름을 변수로 사용하고 변수 이름에 의해 이미 "오버라이드"된 후 해당 함수를 사용하려는 경우입니다.
t = ('a', "letter")
value, type = t
print(value, type)
del type
print(type(value))
출력:
a letter
<class 'str'>
또 다른 틈새 용도:ROOT5 또는 ROOT6을 사용하는 pyroot에서 "del"은 더 이상 길지 않은 기존 C++ 개체를 참조하는 python 개체를 제거하는 데 유용할 수 있습니다.이를 통해 pyroot의 동적 룩업을 통해 동일한 이름의 C++ 개체를 찾아 python 이름에 바인딩할 수 있습니다.따라서 다음과 같은 시나리오를 사용할 수 있습니다.
import ROOT as R
input_file = R.TFile('inputs/___my_file_name___.root')
tree = input_file.Get('r')
tree.Draw('hy>>hh(10,0,5)')
R.gPad.Close()
R.hy # shows that hy is still available. It can even be redrawn at this stage.
tree.Draw('hy>>hh(3,0,3)') # overwrites the C++ object in ROOT's namespace
R.hy # shows that R.hy is None, since the C++ object it pointed to is gone
del R.hy
R.hy # now finds the new C++ object
ROOT7의 보다 깔끔한 객체 관리로 이 틈새가 닫히기를 바랍니다.
del
는 변수가 다시 초기화되지 않는 한 현재 범위에서 변수를 삭제합니다.「 」로 None
현재 범위로 유지합니다.
a = "python string"
print(a)
del a
print(a)
a = "new python string"
print(a)
출력:
python string
Traceback (most recent call last):
File "testing.py", line 4, in <module>
print(a)
NameError: name 'a' is not defined
대화형 콘솔 답변을 보지 못했기 때문에 보여 드리겠습니다.
foo=None
그 참조와 객체가 존재하지만, 그것을 가리키는 것이 아닙니다.
한편, 「 」는, 「 」, 「 」의 사이에del foo
대상과 참조도 파괴합니다.
이런 if foo is None
되었습니다.rise
NameError
그 , 그 에 있는 .del
대상 목록을 삭제하면 왼쪽에서 오른쪽으로 각 대상이 반복적으로 삭제됩니다.
★★★★★★★★★★★★★★★★★.foo=None
는 단지 을 일 뿐입니다.None
그래서 그 물체에 대한 참조는 아직 유효합니다.
[...Python]에서 변수는 객체에 대한 참조이며 모든 변수는 모든 객체를 참조할 수 있습니다.[...
제 2센트 기부금입니다.
Nlopt 라이브러리를 사용하는 경우 최적화 문제가 있습니다.클래스와 그 메서드를 초기화할 때 코드의 다른 부분에서 사용하고 있었습니다.
나는 같은 수치 문제를 적용해도 결과가 좋지 않았다.
그렇게 함으로써 오브젝트에 문제가 없어야 할 때 spirius 데이터가 포함되어 있다는 것을 알게 되었습니다.del을 사용한 후 메모리가 올바르게 클리어되고 있기 때문에 적절한 컨스트럭터가 없으면 일부 변수가 재사용되지 않을 수 있는 클래스 내부 문제일 수 있습니다.
사용할 필요가 있는 경우는, 다음과 같습니다.
del serial
serial = None
다음 이유만 사용합니다.
serial = None
시리얼 포트를 즉시 다시 열 수 있을 만큼 빠르게 해제하지 않았습니다.그 교훈으로 나는 알았다del
this now! it to it 당장 ! 완성될 까지 기다려라) 라는많은 유용합니다.GC this now! and wait it to expected it" (지금 당장 GC! 완성될 때까지 기다려라) 라는 의미입니다.이치노아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.system.gc.del_this_and_wait_balbalbalba(obj)
.
del은 많은 언어에서 다른 언어에서 python으로 이동하는 교차 참조점으로서 "del"과 동등합니다.사람들은 그들의 모국어로 하던 것과 같은 일을 하는 명령을 찾는 경향이 있다.또한 var를 "로 설정하거나 none으로 설정해도 var는 스코프에서 실제로 삭제되지 않습니다.var의 이름 자체가 여전히 메모리에 저장될 수 있는 가치를 비울 뿐입니다. 왜일까요?메모리 부하가 높은 스크립트로...쓰레기는 절대 안 돼 그리고 어쨌든...모든 언어에는 "삭제/삭제" var 함수의 형태가 있습니다.왜 비단뱀이 아니지?
언급URL : https://stackoverflow.com/questions/6146963/when-is-del-useful-in-python
'sourcecode' 카테고리의 다른 글
JavaScript를 사용하는 URL의 마지막 세그먼트 (0) | 2022.09.06 |
---|---|
모든 정적 문자열을 한 곳에 배치하는 방법 (0) | 2022.09.06 |
Java에서의 이니셜라이저와 컨스트럭터 사용 (0) | 2022.09.06 |
여러 옵션 필드 필터를 사용한 SQL 키워드 검색(메타베이스) (0) | 2022.09.06 |
PHP 다른 네임스페이스에서 모든 클래스를 가져오는 방법 (0) | 2022.09.06 |