পাইথনে, ডিকোশনারীকে কল করা 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)