अजगर में, क्या किसी शब्दकोश में कॉल करने clear()और असाइन {}करने में अंतर है ? यदि हां, तो यह क्या है? उदाहरण:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
अजगर में, क्या किसी शब्दकोश में कॉल करने 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 = {} दो बार के रूप में तेजी से खत्म हो गया है:
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 fun(d):
d.clear()
d["b"] = 2
d={"a": 2}
fun(d)
d # {'b': 2}
शब्दकोश को फिर से असाइन करने से एक नई वस्तु बनेगी और मूल को संशोधित नहीं किया जा सकेगा।
एक बात का उल्लेख नहीं है मुद्दों scoping है। एक महान उदाहरण नहीं है, लेकिन यहाँ मामला है जहाँ मैं समस्या में भाग गया:
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इस मुद्दे को संबोधित करने के लिए कीवर्ड जोड़ा , और यह काम करेगा।
इसके अलावा, कभी-कभी तानाशाह का उदाहरण तानाशाही ( defaultdictउदाहरण के लिए) का उपवर्ग हो सकता है । उस मामले में, का उपयोग clearकरना पसंद किया जाता है, क्योंकि हमें सही प्रकार का ताना-बाना याद नहीं रखना है, और डुप्लिकेट कोड से भी बचना चाहिए (शुरुआती लाइन के साथ क्लियरिंग लाइन को युग्मित करना)।
x = defaultdict(list)
x[1].append(2)
...
x.clear() # instead of the longer x = defaultdict(list)