টিপলসগুলিতে কেন পরিবর্তনযোগ্য আইটেম থাকতে পারে?


178

যদি একটি টিপল অপরিবর্তনীয় হয় তবে কেন এটিতে পরিবর্তনীয় আইটেম থাকতে পারে?

এটি আপাতদৃষ্টিতে একটি বৈপরীত্য যে কোনও তালিকার মতো কোনও পরিবর্তনীয় আইটেমটি যখন সংশোধন করে, তখন এটি দ্বিধাগ্রস্থ হয় যা অপরিবর্তনীয়।

উত্তর:


205

এটি একটি দুর্দান্ত প্রশ্ন।

মূল অন্তর্দৃষ্টিটি হ'ল টিপলগুলির জানার কোনও উপায় নেই যে তাদের ভিতরে থাকা বস্তুগুলি পরিবর্তনীয় whether কেবলমাত্র একটি জিনিস যা কোনও বস্তুকে পরিবর্তনীয় করে তোলে তা হ'ল এমন একটি পদ্ধতি যা তার ডেটার পরিবর্তিত করে। সাধারণভাবে এটি সনাক্ত করার কোনও উপায় নেই।

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

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

আমরা যখন এই বিষয়টিতে রয়েছি, তখন টিউপলগুলি কীভাবে হয়, কীভাবে তারা কাজ করে এবং তাদের লক্ষ্যযুক্ত ব্যবহার সম্পর্কে আপনার মানসিক মডেলটি সম্পূর্ণ করতে এখানে আরও কয়েকটি চিন্তাভাবনা রয়েছে:

  1. টিপলগুলি তাদের অপরিবর্তনযোগ্যতা দ্বারা কম চিহ্নিত করা হয় এবং তাদের উদ্দেশ্যযুক্ত উদ্দেশ্য দ্বারা আরও বেশি।
    টিপলস হ'ল পাইথনের এক ছাদের নীচে বিবিধ তথ্য সংগ্রহ করার উপায় th উদাহরণস্বরূপ, s = ('www.python.org', 80) একটি স্ট্রিং এবং একটি সংখ্যা একত্রিত করে যাতে হোস্ট / পোর্ট জুটি সকেট, একটি যৌগিক অবজেক্ট হিসাবে পাস হতে পারে। এই আলোতে দেখা হয়েছে, পারস্পরিক পরিবর্তনযোগ্য উপাদানগুলি রাখা পুরোপুরি যুক্তিসঙ্গত।

  2. অপরিচ্ছন্নতা অন্য সম্পত্তি, হ্যাশাবিলিটির সাথে একসাথে যায় । তবে হ্যাশাবিলিটি কোনও পরম সম্পত্তি নয়। যদি টিউপলের কোনও উপাদান হ্যাশেবল না হয় তবে সামগ্রিকভাবে টিপলটি হ্যাশযোগ্য নয়। উদাহরণস্বরূপ, t = ('red', [10, 20, 30])হ্যাশযোগ্য নয়।

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

দুটি জিনিস মনে রাখবেন। প্রথমত, অপরিবর্তনীয়তা যাদু নয় - এটি কেবল পরিবর্তনের পদ্ধতির অনুপস্থিতি। দ্বিতীয়ত, বস্তুগুলি কী ভেরিয়েবল বা পাত্রে তাদের উল্লেখ করে তা জানে না - তারা কেবল রেফারেন্সের গণনা জানে।

আশা করি, এটি আপনার জন্য দরকারী ছিল :-)


এটি কি ভুল নয় "টিপলসগুলির জানার কোনও উপায় নেই যে তাদের অভ্যন্তরের বস্তুগুলি পরিবর্তনযোগ্য whether" রেফারেন্সটি হ্যাশ পদ্ধতি প্রয়োগ করে কিনা তা আমরা সনাক্ত করতে পারি, তারপরে এটি পরিবর্তনযোগ্য। একটি dic বা সেট মত কাজ করবে। এটি কী টিউপলগুলি বোঝানো হচ্ছে তার জন্য কোনও ডিজাইনের সিদ্ধান্তের বেশি হবে না?
garg10may

@ Garg10may 1) হ্যাশিবিলিটি কল না করে সনাক্ত করা সহজ নয় hash()কারণ বস্তু () থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত কিছুই হ্যাশযোগ্য এবং তাই সাবক্লাসগুলি স্পষ্টভাবে হ্যাশ-অফ-অফ করা দরকার। ২) হাশিবিলিটি অপরিবর্তনীয়তার গ্যারান্টি দেয় না - হ্যাশেবল অবজেক্টের যে উদাহরণ পরিবর্তনযোগ্য তা সহজেই তৈরি করা সহজ। ৩) পাইথনের বেশিরভাগ পাত্রে যেমন টিপলস কেবল অন্তর্নিহিত অবজেক্টের উল্লেখ করে - তাদের পরিদর্শন ও সেগুলি সম্পর্কে কোনও তদন্ত করার কোনও দায়বদ্ধতা নেই।
রেমন্ড

171

এটি কারণ টিউপলগুলিতে তালিকা, স্ট্রিং বা নম্বর থাকে না numbers এগুলিতে অন্যান্য বস্তুর উল্লেখ রয়েছে । 1 টিউপলে থাকা রেফারেন্সের ক্রমটি পরিবর্তন করতে অক্ষমতার অর্থ এই নয় যে আপনি re রেফারেন্সগুলির সাথে যুক্ত জিনিসগুলিকে পরিবর্তন করতে পারবেন না। 2

১. অবজেক্টস, মান এবং প্রকারগুলি (দেখুন: দ্বিতীয় থেকে শেষ অনুচ্ছেদে)
২. স্ট্যান্ডার্ড ধরণের শ্রেণিবিন্যাস (দেখুন: "অপরিবর্তনীয় ক্রম")


8
প্রশ্নে একটি অস্পষ্টতা আছে। এই উত্তরটি সম্পূর্ণরূপে ব্যাখ্যা দিয়েছে কেন এটা সম্ভব tuples চপল বস্তু ধারণ করে। এটি ব্যাখ্যা করে না যে কেন টিউপসগুলি পরিবর্তনীয় জিনিসগুলিকে ধারণ করার জন্য ডিজাইন করা হয়েছিল । আমি মনে করি দ্বিতীয়টি আরও প্রাসঙ্গিক প্রশ্ন।
প্রেরক

16

প্রথমত, "অপরিবর্তনীয়" শব্দের অর্থ বিভিন্ন লোকের কাছে বিভিন্ন রকমের অর্থ হতে পারে। আমি বিশেষত পছন্দ করি যে এরিক লিপার্ট কীভাবে তার ব্লগ পোস্টে অপরিবর্তনীয়তাকে শ্রেণিবদ্ধ করেছেন । সেখানে তিনি এই ধরণের অপরিবর্তনীয়তার তালিকা দিয়েছেন:

  • বাস্তব-ট্রুলিও অপরিবর্তনীয়তা
  • একবারে লিখুন অযোগ্যতা
  • পপসিকাল অপরিবর্তনীয়তা
  • অগভীর বনাম গভীর অপরিবর্তনশীলতা
  • অপরিষ্কার মুখোমুখি
  • পর্যবেক্ষণমূলক অপরিবর্তনীয়তা

আরও বিভিন্ন ধরণের অপরিবর্তনীয়তা তৈরি করতে এগুলি বিভিন্ন উপায়ে একত্রিত করা যেতে পারে এবং আমি নিশ্চিত যে আরও অস্তিত্ব রয়েছে। যে ধরনের অপরিবর্তনীয়তা আপনি গভীর (ট্রানজিটিভ নামে পরিচিত) অপরিবর্তনীয়তা সম্পর্কে আগ্রহী বলে মনে করেন, যেখানে অপরিবর্তনীয় বস্তুগুলিতে কেবল অন্যান্য অপরিবর্তনীয় বস্তু থাকতে পারে।

এর মূল বক্তব্যটি হ'ল গভীর অপরিবর্তনশীলতা হ'ল বহু, বহু ধরণের অপরিবর্তনীয়তা। আপনি যেকোন ধরনের পছন্দকে গ্রহণ করতে পারেন, যতক্ষণ না আপনি সচেতন হন যে আপনার "অপরিবর্তনীয়" ধারণাটি সম্ভবত অন্য কারও "অপরিবর্তনীয়" ধারণার থেকে পৃথক।


পাইথন টিপলসের কোন ধরণের অপ্রচলতা রয়েছে?
qazwsx

3
পাইথনের টিপলগুলিতে অগভীর (ওরফে অ-ট্রান্সজিটিভ) অনিবার্যতা রয়েছে।
কেন ওয়েইন ভেন্ডারলিন্ডে

16

আমি এটি বুঝতে পেরেছি, এই প্রশ্নটির নকশা সিদ্ধান্ত সম্পর্কে একটি প্রশ্ন হিসাবে পুনরায় পুনঃস্থাপন করা দরকার: পাইথনের ডিজাইনাররা কেন এমন পরিবর্তনীয় ক্রম প্রকার তৈরি করতে বেছে নিয়েছিল যাতে পারস্পরিক পরিবর্তনযোগ্য বস্তু থাকতে পারে?

এই প্রশ্নের উত্তরের জন্য, আমাদের টিউপলগুলি যে উদ্দেশ্যে উদ্দেশ্য করে সে সম্পর্কে চিন্তা করতে হবে: এগুলি দ্রুত , সাধারণ উদ্দেশ্য অনুসারে কাজ করে। এই বিষয়টি মাথায় রেখে, এটি একেবারে স্পষ্ট হয়ে ওঠে যে কেন টিউপসগুলি অপরিবর্তনীয় তবে এতে পরিবর্তনীয় জিনিস থাকতে পারে। বুদ্ধিমান:

  1. টিপলগুলি দ্রুত এবং স্মৃতিশক্তি দক্ষ: টিপলগুলি তালিকার তুলনায় দ্রুত তৈরি হয় কারণ এগুলি অপরিবর্তনীয়। অপরিচ্ছন্নতা মানে ধ্রুবক ভাঁজ ব্যবহার করে টিপলগুলি ধ্রুবক হিসাবে তৈরি করা যেতে পারে এবং এ জাতীয় লোড করা যেতে পারে । এর অর্থ হ'ল তারা তৈরি করতে আরও দ্রুত এবং আরও মেমরি দক্ষ, কারণ সামগ্রিককরণ ইত্যাদির প্রয়োজন নেই etc. এগুলি এলোমেলো আইটেম অ্যাক্সেসের জন্য তালিকার তুলনায় কিছুটা ধীরে ধীরে , তবে আনপ্যাক করার জন্য আবার দ্রুত (কমপক্ষে আমার মেশিনে) faster যদি টিপলগুলি পরিবর্তনযোগ্য হয় তবে এগুলি এর মতো উদ্দেশ্যে তত দ্রুত হবে না।

  2. টিপলস সাধারণ-উদ্দেশ্য : টিপলসগুলিকে কোনও ধরণের অবজেক্ট রাখতে সক্ষম হওয়া দরকার। তারা (দ্রুত) পরিবর্তনশীল দৈর্ঘ্যের আর্গুমেন্ট তালিকার মতো কাজগুলি করতে ( *ফাংশন সংজ্ঞায়িত অপারেটরের মাধ্যমে ) অভ্যস্ত। যদি টিপলস পরিবর্তনীয় অবজেক্টগুলি ধরে রাখতে না পারে তবে তারা এ জাতীয় জিনিসের জন্য অকেজো। পাইথনকে তালিকাগুলি ব্যবহার করতে হবে, যা সম্ভবত জিনিসগুলি ধীর করবে এবং মেমরির দক্ষতা কম হবে।

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


12

আপনি idএর আইটেমগুলির পরিবর্তন করতে পারবেন না । সুতরাং এটিতে সর্বদা একই আইটেম থাকবে।

$ python
>>> t = (1, [2, 3])
>>> id(t[1])
12371368
>>> t[1].append(4)
>>> id(t[1])
12371368

এটি উপরের উদাহরণগুলির মধ্যে সবচেয়ে উপযুক্ত বিক্ষোভ। টুপলের সেই সমস্ত অবজেক্টের রেফারেন্স রয়েছে যা পরিবর্তিত হয় না, যদিও সর্বাধিক একটি মিউটেবল উপাদান থাকা পুরো টিপলটিকে অপসারণযোগ্য করে তোলে।
পাইপি

5

আমি একটি দন্ড এখানে বেরিয়ে এসে তোমরা বোল যে এখানে প্রাসঙ্গিক অংশ আপনি একটি তালিকা বিষয়বস্তু, অথবা একটি বস্তু অবস্থা পরিবর্তন পারে, একটি tuple মধ্যে অন্তর্ভুক্ত করা হয় করব, আপনি কি করতে পারবেন পরিবর্তন যে বস্তু বা তালিকা আছে। যদি আপনার কাছে এমন কিছু থাকে যা জিনিসের উপর নির্ভর করে [3] একটি তালিকা হয়ে থাকে, এমনকি খালিও হয় তবে আমি দেখতে পেতাম এটি দরকারী।


3

একটি কারণ হ'ল পাইথনে কোনও পরিবর্তনীয় ধরণের পরিবর্তনযোগ্য রূপে রূপান্তর করার কোনও সাধারণ উপায় নেই (প্রত্যাখ্যাত পিইপি 351 দেখুন , এবং কেন এটি প্রত্যাখ্যান করা হয়েছিল তার জন্য লিঙ্কযুক্ত আলোচনা দেখুন )। সুতরাং, ব্যবহারকারীর দ্বারা তৈরি কোনও অ-হ্যাশযোগ্য অবজেক্ট সহ প্রায়শই এই বিধিনিষেধটি থাকায় টিপলে বিভিন্ন ধরণের অবজেক্টগুলি স্থাপন করা অসম্ভব।

অভিধান এবং সেটগুলিতে এই বিধিনিষেধের একমাত্র কারণ হ'ল তাদের হ্যাশ টেবিল হিসাবে অভ্যন্তরীণভাবে প্রয়োগ করা হওয়ায় তারা বস্তুগুলি হ্যাশযোগ্য হওয়া দরকার। তবে লক্ষ করুন যে, উপহাসের সাথে, অভিধান এবং সেগুলি নিজেরাই স্থাবর (বা হ্যাশযোগ্য) নয় are টিপলসগুলি কোনও অবজেক্টের হ্যাশ ব্যবহার করে না, সুতরাং এর পরিবর্তনটি কোনও বিষয় নয়।


2

একটি টিউপল এই অর্থে অপরিবর্তনীয় যে টিপল নিজেই প্রসারিত বা সঙ্কুচিত হতে পারে না, এমন নয় যে নিজের মধ্যে থাকা সমস্ত আইটেমগুলি পরিবর্তনযোগ্য। অন্যথায় tuples নিস্তেজ হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.