답변:
동일한 사전을 참조하는 다른 변수가 있으면 큰 차이가 있습니다.
>>> 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 = {}가 두 배 빠릅니다.
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
d = {}
나중에 전체를 정리하는 것이 가비지 콜렉터에 남아있을 수 있으므로 설정 이 더 빨라야한다는 것입니다.
@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 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()
누군가가 더 실용적인 예를 생각하면 자유롭게이 게시물을 편집하십시오.
global c_kwargs
아마 작동하지 않을까요? 아마 global
많이 사용하는 것이 가장 좋은 것은 아니지만.
global
하면 함수가 다르게 동작하게됩니다. conf_decorator에 대한 모든 호출은 동일한 c_kwargs 변수를 공유합니다. 파이썬 3 nonlocal
이이 문제를 해결하기 위해 키워드를 추가 했다고 생각합니다.