python - টুপল স্লাইসিং তালিকার বিপরীতে কোনও নতুন অবজেক্ট ফেরত দেবে না




list tuples (3)

পাইথনে (2 এবং 3)। যখনই আমরা তালিকাটি স্লাইসিং ব্যবহার করি এটি একটি নতুন অবজেক্ট প্রদান করে, যেমন:

l1 = [1,2,3,4]
print(id(l1))
l2 = l1[:]
print(id(l2))

আউটপুট

>>> 140344378384464
>>> 140344378387272

যদি একই জিনিসকে টিপল দিয়ে পুনরাবৃত্তি করা হয়, একই জিনিসটি ফিরে আসে, যেমন:

t1 = (1,2,3,4)
t2 = t1[:]
print(id(t1))
print(id(t2))

আউটপুট

>>> 140344379214896
>>> 140344379214896

এটি কেন ঘটছে সে সম্পর্কে কেউ যদি কিছুটা আলোকপাত করতে পারে তবে দুর্দান্ত হবে, আমার পাইথনের পুরো অভিজ্ঞতা জুড়ে আমি ছাপের মধ্যে ছিলাম খালি টুকরো নতুন কোনও বস্তু ফেরায়।

আমার বোধগম্যতা হ'ল এটি একই পদার্থটি ফিরিয়ে দিচ্ছে যেমন টিউপসগুলি স্থাবর হয় এবং এটির একটি নতুন অনুলিপি তৈরি করার কোনও মানে নেই। কিন্তু আবার, নথিতে এটি কোথাও উল্লেখ করা হয়নি।


এটি বাস্তবায়নের বিশদ। কারণ তালিকাগুলি পরিবর্তনীয়, l1[:] অবশ্যই একটি অনুলিপি তৈরি করতে হবে, কারণ আপনি l2 কে প্রভাবিত করার জন্য l2 পরিবর্তনের আশা করবেন না।

যেহেতু একটি টিউপল অপরিবর্তনীয় , তবে, টি 2-তে আপনার করার মতো কিছুই নেই যা কোনও দৃশ্যমান উপায়ে টি 1 কে প্রভাবিত করবে, তাই t1 এবং টি t1[:] জন্য একই বস্তুটি ব্যবহার করার জন্য বিনামূল্যে (তবে প্রয়োজনীয় নয়) t1[:]


এটি সম্পর্কে নিশ্চিত নয় তবে মনে হচ্ছে পাইথন আপনাকে একই জিনিসটিতে একটি নতুন পয়েন্টার সরবরাহ করে যাতে কপিগুলি এড়ানোর জন্য যেহেতু টিউপসগুলি অভিন্ন (এবং যেহেতু বস্তুটি একটি টিউপল, এটি পরিবর্তনযোগ্য)।


বাস্তবায়নগুলি অপরিবর্তনীয় প্রকারের জন্য অভিন্ন দৃষ্টান্ত ফিরিয়ে দিতে বিনামূল্যে (সিপিথনে, আপনি মাঝে মাঝে স্ট্রিং এবং পূর্ণসংখ্যার জন্য একই রকম অপটিমাইজেশন দেখতে পাবেন)। যেহেতু অবজেক্টটি পরিবর্তন করা যায় না, তাই ব্যবহারকারী কোডে এমন কোনও কিছুই নেই যা এটির কোনও অনন্য উদাহরণ রয়েছে বা বিদ্যমান উদাহরণের সাথে অন্য কোনও রেফারেন্স রয়েছে কিনা তা যত্নশীল হওয়া দরকার।

আপনি here সি কোড শর্ট সার্কিট খুঁজে পেতে পারেন।

static PyObject*
tuplesubscript(PyTupleObject* self, PyObject* item)
{
    ... /* note: irrelevant parts snipped out */
    if (start == 0 && step == 1 &&
                 slicelength == PyTuple_GET_SIZE(self) &&
                 PyTuple_CheckExact(self)) {
            Py_INCREF(self);          /* <--- increase reference count */
            return (PyObject *)self;  /* <--- return another pointer to same */
        }
    ...

এটি একটি বাস্তবায়ন বিশদ, নোট করুন যে pypy একই কাজ করে না।







cpython