এর []
চেয়ে দ্রুত কেন list()
?
বৃহত্তম কারণ হ'ল পাইথন list()
কেবলমাত্র একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটির মতো আচরণ করে যার অর্থ আপনি অন্য কোনও কিছুকে এ্যালাইজ করে এটিকে বাধা দিতে পারেনlist
কিছু আলাদা করতে পারেন (যেমন নিজের নিজস্ব সাবক্ল্যাসড তালিকা বা সম্ভবত কোনও ডীক ব্যবহার করুন)।
এটি সঙ্গে সঙ্গে বিল্টিন তালিকার একটি নতুন উদাহরণ তৈরি করে []
।
আমার ব্যাখ্যা আপনাকে এর জন্য অন্তর্দৃষ্টি দিতে চায়।
ব্যাখ্যা
[]
সাধারণত আক্ষরিক বাক্য গঠন হিসাবে পরিচিত।
ব্যাকরণে, এটি একটি "তালিকা প্রদর্শন" হিসাবে উল্লেখ করা হয়। ডক্স থেকে :
একটি তালিকা প্রদর্শন হ'ল বর্গাকার বন্ধনীগুলিতে আবদ্ধ একটি সম্ভাব্য শৃঙ্খলা সিরিজ:
list_display ::= "[" [starred_list | comprehension] "]"
একটি তালিকা প্রদর্শন একটি নতুন তালিকা অবজেক্ট উত্পন্ন করে, সামগ্রীগুলি এক্সপ্রেশনগুলির একটি তালিকা বা কোনও বোধগম্যতা দ্বারা নির্দিষ্ট করা হচ্ছে। যখন কমা দ্বারা বিভক্ত এক্সপ্রেশনগুলির তালিকা সরবরাহ করা হয়, তখন এর উপাদানগুলি বাম থেকে ডানে মূল্যায়ন করা হয় এবং সেই ক্রমে তালিকার অবজেক্টে স্থাপন করা হয়। যখন কোনও বোধগম্য সরবরাহ করা হয়, তখন তালিকাটি বোঝার ফলে তৈরি উপাদানগুলি থেকে তৈরি করা হয়।
সংক্ষেপে, এর অর্থ হ'ল একটি বিল্টিন অবজেক্ট টাইপ list
তৈরি করা হয়েছে।
এটির কোনও ছাঁটাই নেই - যার অর্থ পাইথন যত তাড়াতাড়ি সম্ভব এটি করতে পারে।
অন্যদিকে, বিল্টিন তালিকা নির্মাণকারী ব্যবহার করে বিল্টিন list()
তৈরি করা থেকে বিরত থাকতে পারে list
।
উদাহরণস্বরূপ, বলুন আমরা চাই আমাদের তালিকাটি শোরগোলের সাথে তৈরি করা হোক:
class List(list):
def __init__(self, iterable=None):
if iterable is None:
super().__init__()
else:
super().__init__(iterable)
print('List initialized.')
এরপরে আমরা list
মডিউল স্তরের বৈশ্বিক list
স্কোপটিতে নামটি আটকাতে পারি এবং তারপরে যখন আমরা একটি তৈরি করি, আমরা আসলে আমাদের সাব-টাইপ তালিকা তৈরি করি:
>>> list = List
>>> a_list = list()
List initialized.
>>> type(a_list)
<class '__main__.List'>
একইভাবে আমরা এটি বিশ্বব্যাপী নেমস্পেস থেকে সরিয়ে ফেলতে পারি
del list
এবং এটি বিল্টিন নেমস্পেসে রাখুন:
import builtins
builtins.list = List
এবং এখন:
>>> list_0 = list()
List initialized.
>>> type(list_0)
<class '__main__.List'>
এবং নোট করুন যে তালিকা প্রদর্শনটি নিঃশর্তভাবে একটি তালিকা তৈরি করে:
>>> list_1 = []
>>> type(list_1)
<class 'list'>
আমরা সম্ভবত এটি অস্থায়ীভাবে করি, সুতরাং আমাদের পরিবর্তনগুলি পূর্বাবস্থায় ফেলা যাক - প্রথমে List
বিল্টিনগুলি থেকে নতুন অবজেক্টটি সরিয়ে দিন:
>>> del builtins.list
>>> builtins.list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'builtins' has no attribute 'list'
>>> list()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'list' is not defined
ওহ, না, আমরা আসলটির ট্র্যাক হারিয়ে ফেলেছি।
চিন্তা করার দরকার নেই, আমরা এখনও পেতে পারি list
- এটি তালিকার আক্ষরিক তালিকার ধরণ:
>>> builtins.list = type([])
>>> list()
[]
তাই ...
এর []
চেয়ে দ্রুত কেন list()
?
যেমনটি আমরা দেখেছি - আমরা ওভাররাইট করতে পারি list
- তবে আমরা আক্ষরিক ধরণের তৈরিতে বাধা দিতে পারি না। যখন আমরা ব্যবহার list
করি তখন আমাদের কিছু আছে কিনা তা দেখার জন্য আমাদের অনুসন্ধান করতে হবে।
তারপরে আমরা যা কলযোগ্য তা কল করতে হবে। ব্যাকরণ থেকে:
কল একটি কলযোগ্য বস্তুকে কল করে (উদাহরণস্বরূপ, একটি ফাংশন) সম্ভবত খালি সিরিজের যুক্তিগুলির সাথে:
call ::= primary "(" [argument_list [","] | comprehension] ")"
আমরা দেখতে পাচ্ছি যে এটি কেবল নামের জন্য নয়, কোনও নামের জন্য একই কাজ করে:
>>> import dis
>>> dis.dis('list()')
1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 RETURN_VALUE
>>> dis.dis('doesnotexist()')
1 0 LOAD_NAME 0 (doesnotexist)
2 CALL_FUNCTION 0
4 RETURN_VALUE
জন্য []
সেখানে পাইথন বাইটকোড পর্যায়ে কোন ফাংশন কল হল:
>>> dis.dis('[]')
1 0 BUILD_LIST 0
2 RETURN_VALUE
এটি কেবল বাইকোড স্তরে কোনও লুকআপ বা কল ছাড়াই তালিকাটি তৈরি করতে সরাসরি চলে যায়।
উপসংহার
আমরা প্রমাণ করে দিয়েছি যে list
স্কোপিংয়ের নিয়ম ব্যবহার করে ব্যবহারকারীর কোডের সাথে বাধা দেওয়া যেতে পারে এবং এটি list()
একটি কলযোগ্য অনুসন্ধান করে এবং তারপরে এটিকে কল করে।
যদিও []
একটি তালিকা প্রদর্শন, বা একটি আক্ষরিক, এবং এইভাবে নাম অনুসন্ধান এবং ফাংশন কল এড়ানো হয়।
()
এবং''
বিশেষ, কারণ এগুলি কেবল খালি নয়, তারা পরিবর্তনযোগ্য এবং এগুলি হিসাবে, তাদের একক করে তোলা এটি একটি সহজ জয়; তারা এমনকি নতুন অবজেক্টগুলি তৈরি করে না, খালিtuple
/ একা জন্য সিঙ্গলটন লোড করেstr
। টেকনিক্যালি একটি বাস্তবায়ন বিস্তারিত, কিন্তু আমি একটি কঠিন সময় কল্পী কেন তারা আছে না খালি ক্যাশেtuple
/str
কর্মক্ষমতা কারণে। সুতরাং একটি স্টক আক্ষরিক সম্পর্কে আপনার অনুভূতি[]
এবং{}
ফিরে পাস ভুল ছিল, কিন্তু এটি প্রযোজ্য()
এবং''
।