programing

Python에서 dict.clear()와 {} 할당 간의 차이

mailnote 2023. 6. 15. 22:02
반응형

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

반응형