পাইথনে, ডিকোশনারীকে কল করা 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এখনও পুরানো অভিধানে আইটেমগুলি সহ নির্দেশ করে leaves যাইহোক, 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 = {}দ্রুত হওয়া উচিত কারণ পুরো পরিষ্কার করার পরে আবর্জনা সংগ্রাহকের কাছে রেখে দেওয়া যেতে পারে।
@ ওডানো'র উত্তর ছাড়াও, আপনি যদি বহুবার ডিকটি 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করে ফাংশনটি অন্যরকমভাবে আচরণ করতে সক্ষম করবে - কনফ_ডেকোরেটরকে সমস্ত কলগুলি একই সি_কওয়ার্গগুলি পরিবর্তনশীল ভাগ করবে। আমি বিশ্বাস করি পাইথন 3 nonlocalএই সমস্যাটি সমাধান করার জন্য কীওয়ার্ড যুক্ত করেছে এবং এটি কার্যকর হবে।
তদাতিরিক্ত, কখনও কখনও ডিক উদাহরণটি ডিকের একটি সাবক্লাস হতে পারে ( defaultdictউদাহরণস্বরূপ)। clearসেক্ষেত্রে ব্যবহারকে অগ্রাধিকার দেওয়া হয়েছে, কারণ আমাদের ডিকের সঠিক ধরণটি মনে রাখতে হবে না এবং সদৃশ কোডও এড়ানো উচিত নয় (ক্লিয়ারিং লাইনের সাথে ক্লিয়ারিং লাইনের সাথে মিলিত হওয়া)।
x = defaultdict(list)
x[1].append(2)
...
x.clear() # instead of the longer x = defaultdict(list)