Python에서 dict.clear()와 {} 할당 간의 차이
파이썬에서 호출하는 것과 다른 점이 있습니까?clear()할당하기{}사전에?만약 그렇다면, 무엇입니까?예:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
동일한 사전을 참조하는 다른 변수가 있는 경우에는 큰 차이가 있습니다.
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d = {}
>>> d2
{'stuff': 'things'}
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d.clear()
>>> d2
{}
이는 할당하기 때문입니다.d = {}빈 사전을 새로 만들고 이 사전을 에 할당합니다.d변수.이것은 남습니다.d2항목이 남아 있는 오래된 사전을 가리키고 있습니다.하지만,d.clear()와 동일한 사전을 지웁니다.d그리고.d2두 지점 모두.
d = {}의 새 인스턴스를 만듭니다.d하지만 다른 모든 언급은 여전히 오래된 내용을 가리킬 것입니다. d.clear()내용이 재설정되지만 동일한 인스턴스에 대한 모든 참조는 여전히 정확합니다.
다른 답변에 언급된 차이점 외에도 속도 차이가 있습니다. d = {}은(는) 두 배 이상 빠릅니다.
python -m timeit -s "d = {}" "for i in xrange(500000): d.clear()"
10 loops, best of 3: 127 msec per loop
python -m timeit -s "d = {}" "for i in xrange(500000): d = {}"
10 loops, best of 3: 53.6 msec per loop
앞에서 이미 언급한 내용을 예로 들 수 있습니다.
>>> a = {1:2}
>>> id(a)
3073677212L
>>> a.clear()
>>> id(a)
3073677212L
>>> a = {}
>>> id(a)
3073675716L
@odano의 대답 외에도, 그것은 다음을 사용하는 것처럼 보입니다.d.clear()딕트를 여러 번 지우려면 더 빠릅니다.
import timeit
p1 = '''
d = {}
for i in xrange(1000):
d[i] = i * i
for j in xrange(100):
d = {}
for i in xrange(1000):
d[i] = i * i
'''
p2 = '''
d = {}
for i in xrange(1000):
d[i] = i * i
for j in xrange(100):
d.clear()
for i in xrange(1000):
d[i] = i * i
'''
print timeit.timeit(p1, number=1000)
print timeit.timeit(p2, number=1000)
결과는 다음과 같습니다.
20.0367929935
19.6444659233
변환 방법은 원래 개체가 범위를 벗어나는 경우 항상 유용합니다.
def fun(d):
d.clear()
d["b"] = 2
d={"a": 2}
fun(d)
d # {'b': 2}
사전을 다시 할당하면 새 개체가 생성되고 원래 개체가 수정되지 않습니다.
언급되지 않은 한 가지는 범위 지정 문제입니다.좋은 예는 아니지만, 문제가 발생한 경우는 다음과 같습니다.
def conf_decorator(dec):
"""Enables behavior like this:
@threaded
def f(): ...
or
@threaded(thread=KThread)
def f(): ...
(assuming threaded is wrapped with this function.)
Sends any accumulated kwargs to threaded.
"""
c_kwargs = {}
@wraps(dec)
def wrapped(f=None, **kwargs):
if f:
r = dec(f, **c_kwargs)
c_kwargs = {}
return r
else:
c_kwargs.update(kwargs) #<- UnboundLocalError: local variable 'c_kwargs' referenced before assignment
return wrapped
return wrapped
해결책은 교체하는 것입니다.c_kwargs = {}와 함께c_kwargs.clear()
만약 누군가가 더 실용적인 예를 생각해 낸다면, 이 게시물을 자유롭게 편집하세요.
또한 때때로 dict 인스턴스는 dict의 하위 클래스일 수 있습니다.defaultdict예를 들어).이 경우, 사용clear딕트의 정확한 유형을 기억할 필요가 없고 중복 코드(클리어 선을 초기화 선과 일치시키는 것)를 피할 수 있기 때문에 선호됩니다.
x = defaultdict(list)
x[1].append(2)
...
x.clear() # instead of the longer x = defaultdict(list)
언급URL : https://stackoverflow.com/questions/369898/difference-between-dict-clear-and-assigning-in-python
'programing' 카테고리의 다른 글
| 벡터에 지정된 요소가 포함되어 있는지 여부 테스트 (0) | 2023.06.20 |
|---|---|
| if-elif-elif-else 조건을 기반으로 새 열 생성 (0) | 2023.06.20 |
| 가피 가져오기.auth2 in angular 2 type 스크립트 (0) | 2023.06.15 |
| 컴파일 오류:'ASP.global_asax' 유형이 두 DLL에 모두 있습니다. (0) | 2023.06.15 |
| 경로에 따라 각도 4 성분 숨기기 및 표시 (0) | 2023.06.15 |