আমাদের পাইথন (বা কোনও অপরিবর্তনীয় ডেটা টাইপ) এর টিউপস কেন দরকার?


140

আমি বেশ কয়েকটি পাইথন টিউটোরিয়াল (পাইথন ইন্ট পাইথন, একটির জন্য) এবং পাইথন.আর.এর ভাষা উল্লেখ পড়লাম - কেন ভাষা টিউপলসের প্রয়োজন তা আমি দেখতে পাই না।

টিপলসের কোনও তালিকা বা সেটের সাথে তুলনা করার কোনও পদ্ধতি নেই এবং যদি আমাকে একটি সেট বা তালিকায় একটি টুপল রূপান্তর করতে হয় তবে সেগুলি সাজানোর জন্য আমি প্রথমে একটি টিউপল ব্যবহার করার বিন্দুটি কী?

অপরিবর্তনীয়তা?

ভেরিয়েবলটি যখন মূল বরাদ্দ করা হয়েছিল তার চেয়ে আলাদাভাবে মেমরির আলাদা জায়গায় বাস করে তবে কেন তার যত্ন নেই? পাইথনের অপরিবর্তনীয়তার পুরো ব্যবসায়টি বেশি জোর দেওয়া হয়েছে বলে মনে হচ্ছে।

সি / সি ++ এ যদি আমি কোনও পয়েন্টার বরাদ্দ করি এবং কিছু বৈধ মেমরিকে নির্দেশ করি তবে, ঠিকানাটি যতক্ষণ না এটি ব্যবহার করার আগে এটি নাল নয় ততক্ষণ কোথায় অবস্থিত তা আমি বিবেচনা করি না।

আমি যখনই সেই পরিবর্তনশীলটিকে উল্লেখ করি তখনও পয়েন্টারটি মূল ঠিকানার দিকে ইশারা করছে কিনা তা আমার জানতে হবে না। আমি কেবল নাল পরীক্ষা করে দেখুন এবং এটি ব্যবহার করুন (বা না)।

পাইথন-এ, যখন আমি একটি স্ট্রিং বরাদ্দ করি (বা টিপল) এটি এক্সকে নির্ধারিত করে, তারপরে স্ট্রিংটি সংশোধন করুন, কেন এটি মূল অবজেক্টের জন্য আমার যত্ন নেবে? যতক্ষণ না ভেরিয়েবলটি আমার ডেটাতে নির্দেশ করে, ততটাই গুরুত্বপূর্ণ।

>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167

x এখনও আমি যে ডেটা চাই তা উল্লেখ করে, কেন তার আইডিটি একই বা আলাদা হয় তবে কেন তার যত্ন নেওয়া দরকার?


12
আপনি পরিবর্তনের ভুল দিকটির দিকে মনোযোগ দিচ্ছেন: "আইডিটি একই বা আলাদা কিনা" কেবলমাত্র একটি পার্শ্ব প্রতিক্রিয়া; "অন্যান্য তথ্যসূত্রগুলির দ্বারা নির্দেশিত তথ্য যা পূর্বে একই অবজেক্টের দিকে ইঙ্গিত করেছিল এখন আপডেটগুলি প্রতিফলিত করে" কিনা তা সমালোচনামূলক।
চার্লস ডাফি

উত্তর:


124
  1. অপরিবর্তনীয় বস্তুগুলি যথেষ্ট অপ্টিমাইজেশনের অনুমতি দিতে পারে; সম্ভবত এ কারণেই জাভাতে স্ট্রিংগুলিও অপরিবর্তনীয়, একেবারে পৃথকভাবে বিকশিত হলেও পাইথনের একই সময় এবং প্রায় সমস্ত কিছুই সত্যিকারের-কার্যকরী ভাষায় অনিবার্য।

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

অপ্টিমাইজেশান ইস্যুর উদাহরণ:

$ python -mtimeit '["fee", "fie", "fo", "fum"]'
1000000 loops, best of 3: 0.432 usec per loop
$ python -mtimeit '("fee", "fie", "fo", "fum")'
10000000 loops, best of 3: 0.0563 usec per loop

11
@ মিউজিকফ্রেইক, সমুদ্রের তালিকার চেয়ে a. times গুণ বেশি দ্রুতগতির নির্মাণের ক্ষেত্রে আমি সম্পাদনাটি দেখেছি - এখন আপনি বলতে পারবেন না যে আপনি "কখনও লক্ষ্যযোগ্য পার্থক্য" দেখতে পাচ্ছেন না, যদি না আপনার সংজ্ঞা "লক্ষণীয় " সত্যই অদ্ভুত ...
অ্যালেক্স মার্টেলি

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

5
@ অ্যালেক্স, "তালিকাগুলি তৈরির" তুলনায় সত্যিই খুব দ্রুত "বিল্ডিং" করছে, নাকি আমরা পাইপন রানটাইম টিউপলকে ক্যাশে দেওয়ার ফলস্বরূপ দেখতে পাচ্ছি? আমার কাছে পরেরটি মনে হচ্ছে।
ট্রিপটিচ

6
@ কুলি, এটি সম্পূর্ণরূপে randomকলগুলির দ্বারা আধিপত্য বজায় রেখেছে ( এটি করার চেষ্টা করুন, আপনি দেখতে পাবেন!), তাই খুব তাৎপর্যপূর্ণ নয়। চেষ্টা করুন python -mtimeit -s "x=23" "[x,x]"এবং আপনি টিউপল বনাম তালিকা তৈরির জন্য আরও ২-৩ বারের অর্থবহ দ্রুতগতি দেখতে পাবেন।
অ্যালেক্স মার্টেলি

9
যে কারও জন্যই ভাবছেন - আমরা তালিকাগুলি থেকে টিপলগুলিতে স্যুইচ করে এক ঘন্টা ধরে ডেটা প্রসেসিংয়ে শেভ করতে সক্ষম হয়েছি।
মার্ক রিবাউ

42

উপরের উত্তরগুলির মধ্যে কোনটিই টিউপস বনাম তালিকার আসল সমস্যাটি নির্দেশ করে না, যা পাইথনের কাছে অনেকগুলি সম্পূর্ণরূপে বুঝতে পারে না বলে মনে হয়।

টিপলস এবং তালিকা বিভিন্ন উদ্দেশ্যে পরিবেশন করে। একজাতীয় ডেটা সঞ্চয় করে। আপনার এর মতো একটি তালিকা থাকতে পারে এবং থাকা উচিত:

["Bob", "Joe", "John", "Sam"]

তালিকার সঠিক ব্যবহারের কারণ হ'ল এগুলি হ'ল একজাতীয় ধরণের ডেটা, বিশেষত, মানুষের নাম। তবে এটির মতো একটি তালিকা নিন:

["Billy", "Bob", "Joe", 42]

সেই তালিকাটি একজন ব্যক্তির পুরো নাম এবং তাদের বয়স। এটি এক ধরণের ডেটা নয়। সেই তথ্য সংরক্ষণ করার সঠিক উপায়টি হয় একটি টিউপল বা কোনও অবজেক্টে। আমাদের কয়েকটি আছে বলুন:

[("Billy", "Bob", "Joe", 42), ("Robert", "", "Smith", 31)]

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

দয়া করে না।


সম্পাদনা:

আমি মনে করি এই ব্লগ পোস্টটি আমার চেয়ে কেন এটিকে আরও ভাল মনে করে তা ব্যাখ্যা করে: http://news.e-scribe.com/397


13
আমি মনে করি আপনার একটি দৃষ্টি রয়েছে যা কমপক্ষে আমার দ্বারা সম্মত নয়, অন্যকে জানেন না।
স্টেফানো বোরিনি

13
আমিও এই উত্তরটির সাথে দৃ strongly়ভাবে একমত নই। আপনার তালিকা বা টিপল ব্যবহার করা উচিত কিনা এর সাথে ডেটাটির একাকীকরণের একেবারেই কোনও সম্পর্ক নেই। পাইথনের কোনও কিছুই এই পার্থক্যটির পরামর্শ দেয় না।
গ্লেন মেইনার্ড 2

14
কয়েক বছর আগেও গুডো এই বিষয়টি তৈরি করেছে। aspn.activestate.com/ASPN/Mail/Message/python-list/1566320
জন লা

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

9
@ গ্লেন, আপনি মূলত ভুল টিউপলসের প্রধান ব্যবহারগুলির মধ্যে একটি হ'ল সম্পর্কিত একাধিক টুকরোগুলি সংরক্ষণের জন্য সম্মিলিত ডেটা টাইপ। আপনি একটি টিউপল ধরে পুনরাবৃত্তি করতে এবং একই ক্রিয়াকলাপের অনেকগুলি সম্পাদন করতে পারেন তা এটিকে পরিবর্তন করে না। (রেফারেন্স হিসাবে বিবেচনা করুন যে অন্যান্য অনেক ভাষাগুলির তালিকার সমকক্ষগুলির মতো পুনরাবৃত্ত বৈশিষ্ট্যগুলি নেই)
এইচএস।

22

যদি আমাকে অবশ্যই একটি সেট বা তালিকায় একটি টুপলকে রূপান্তর করতে সক্ষম হয় তবে সেগুলি সাজানোর জন্য, প্রথম স্থানে একটি টিপল ব্যবহার করার কী লাভ?

এই বিশেষ ক্ষেত্রে, সম্ভবত একটি পয়েন্ট না। এটি একটি নন-ইস্যু, কারণ আপনি যে কোনও টিপল ব্যবহারের বিষয়টি বিবেচনা করবেন সেটি এটির একটি নয়।

আপনি উল্লেখ হিসাবে, tuples অপরিবর্তনীয়। অপরিবর্তনীয় প্রকারের কারণগুলি টিউপসগুলিতে প্রযোজ্য:

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

দ্রষ্টব্য যে একটি নির্দিষ্ট পাইথন বাস্তবায়ন উপরের সমস্ত বৈশিষ্ট্য ব্যবহার করতে পারে না।

অভিধান কীগুলি অবশ্যই অপরিবর্তনীয় হতে হবে, অন্যথায় কোনও কী-অবজেক্টের বৈশিষ্ট্য পরিবর্তন করা অন্তর্নিহিত ডেটা কাঠামোর আক্রমণকারীদের অকার্যকর করতে পারে। টিপলগুলি সম্ভবত কী হিসাবে ব্যবহৃত হতে পারে। এটি দৃ const়তা সঠিকতার একটি পরিণতি।

পাইপ ইন্টো পাইথন থেকে " টিপলস উপস্থাপন " এছাড়াও দেখুন ।


2
আইডি ((1,2,3)) == আইডি ((1,2,3)) মিথ্যা। আপনি কেবল স্থানটির তুলনা করে টিপলগুলি তুলনা করতে পারবেন না, কারণ রেফারেন্সের মাধ্যমে সেগুলি অনুলিপি করা হয়েছিল বলে কোনও গ্যারান্টি নেই।
গ্লেন মেইনার্ড

@ গ্লেন: "আপনি যখন কপি-বাই-রেফারেন্স ব্যবহার করছেন" তখন যোগ্যতার মন্তব্যটি নোট করুন। কোডার তাদের নিজস্ব বাস্তবায়ন তৈরি করতে পারে, তবে টিপলসগুলির জন্য অনুলিপি-সহ-রেফারেন্স মূলত দোভাষী / সংকলকের জন্য বিষয়। আমি বেশিরভাগ ==প্ল্যাটফর্ম পর্যায়ে কীভাবে প্রয়োগ করা হয় তা উল্লেখ করছিলাম ।
outis

1
@ গ্লেন: আরও মনে রাখবেন যে অনুলিপিটি অনুলিপিগুলিতে প্রযোজ্য নয় (1,2,3) == (1,2,3)। এটি আরও ইন্টার্নিংয়ের বিষয়।
outis

আমি বরং স্পষ্ট করেই বলেছি, রেফারেন্সের মাধ্যমে সেগুলি অনুলিপি করা হয়েছিল এমন কোনও গ্যারান্টি নেই । টিপলস পাইথনে অন্তর্ভুক্ত নয়; এটি একটি স্ট্রিং ধারণা।
গ্লেন মেইনার্ড 21

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

15

কখনও কখনও আমরা অভিধান কী হিসাবে অবজেক্টগুলি ব্যবহার করতে চাই

এটির জন্য মূল্যবান, সম্প্রতি টিপলস (2.6+) বৃদ্ধি index()এবং count()পদ্ধতিগুলি


5
+1: অভিধান কী হিসাবে কোনও পরিবর্তনীয় তালিকা (বা পরিবর্তনযোগ্য সেট বা পরিবর্তনীয় অভিধান) কাজ করতে পারে না। সুতরাং আমাদের মনে হয় অপরিবর্তনীয় তালিকা ("টিপলস"), হিমায়িত সেট এবং ... ভাল ... একটি হিমশীতল ডিকশনারী, আমার মনে হয়।
এস.লট

9

আমি সবসময় একই বেসিক ডেটা স্ট্রাকচারের (অ্যারে) একটি বিশ্রী ডিজাইনের জন্য দুটি সম্পূর্ণ পৃথক ধরণের খুঁজে পেয়েছি তবে বাস্তবে এটি বাস্তব সমস্যা নয়। (প্রতিটি ভাষার নিজস্ব মস্তক রয়েছে, পাইথন অন্তর্ভুক্ত রয়েছে তবে এটি গুরুত্বপূর্ণ নয় isn't)

ভেরিয়েবলটি যখন মূল বরাদ্দ করা হয়েছিল তার চেয়ে আলাদাভাবে মেমরির আলাদা জায়গায় বাস করে তবে কেন তার যত্ন নেই? পাইথনের অপরিবর্তনীয়তার পুরো ব্যবসায়টি বেশি জোর দেওয়া হয়েছে বলে মনে হচ্ছে।

এই বিভিন্ন জিনিস। পরিবর্তনের জায়গাটি স্মৃতিতে সঞ্চিত স্থানের সাথে সম্পর্কিত নয়; এর অর্থ এটি যে জিনিসটিকে নির্দেশ করে তা পরিবর্তন করতে পারে না।

পাইথন অবজেক্টগুলি তৈরি করার পরে, পরিবর্তনযোগ্য বা না হওয়ার পরে অবস্থান পরিবর্তন করতে পারে না। (আরও সঠিকভাবে, আইডির মান () পরিবর্তন করতে পারে না - একই জিনিস, বাস্তবে।) পরিবর্তনীয় বস্তুর অভ্যন্তরীণ সঞ্চয় স্থান পরিবর্তন করতে পারে তবে এটি একটি গোপন বাস্তবায়ন বিশদ।

>>> x='hello'
>>> id(x)
1234567
>>> x='good bye'
>>> id(x)
5432167

এটি পরিবর্তনশীল ("পরিবর্তন") পরিবর্তন করছে না; এটি একই নামের সাথে একটি নতুন ভেরিয়েবল তৈরি করছে, এবং পুরানোটিকে বাদ দিচ্ছে। পরিবর্তনীয় অপারেশনের সাথে তুলনা করুন:

>>> a = [1,2,3]
>>> id(a)
3084599212L
>>> a[1] = 5
>>> a
[1, 5, 3]
>>> id(a)
3084599212L

অন্যরা যেমন উল্লেখ করেছে, এটি অভিধানের কী হিসাবে আরেগুলি এবং অপরিবর্তনীয়তার প্রয়োজন এমন অন্যান্য ডেটা স্ট্রাকচারের অনুমতি দেয়।

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


>>> এ = [1,2,3] >>> আইডি (এ) 3084599212L >>> এ [1] = 5 >>> এ [1, 5, 3] >>> আইডি (ক) 3084599212L আপনি ' সবেমাত্র একটি পরিবর্তনীয় ডেটা টাইপ সংশোধন করেছেন, সুতরাং এটি আসল প্রশ্নের সাথে সম্পর্কিত নয়। x = 'হ্যালো "আইডি (এক্স) 12345 এক্স =" বিদায় "আইডি (এক্স) 65432 কে নতুন বিষয় বা না তা কে চিন্তা করে। যতক্ষণ না এক্স আমার দ্বারা নির্ধারিত ডেটার দিকে নির্দেশ করে, ততই গুরুত্বপূর্ণ
pyNewGuy

4
আপনাকে সাহায্য করার আমার দক্ষতার বাইরে আপনি বিভ্রান্ত হয়ে পড়েছেন।
গ্লেন মেইনার্ড 3

সাব-প্রশ্নগুলিতে বিভ্রান্তি দেখানোর জন্য +1, যা মনে হয় টিপলসের মান বুঝতে অসুবিধার মূল উত্স।
outis

1
যদি আমি পারতাম, তবে কীগুলির জন্য সত্যিকারের রব্রিকটি হ'ল বস্তুটি হ্যাশযোগ্য কিনা ( ডকস.পিথথন.আর.জি.গ্লোসারিHtml # term- হাসেবল ))
outis

7

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

আমি এটি অন্যভাবে দেখতে চাই, অন্যের মতো অতীতেও নয়:

blue= 0, 0, 255
alist= ["red", "green", blue]

নোট করুন যে আমি আলিস্টকে একজাতীয় হিসাবে বিবেচনা করি, এমনকি টাইপ (আলিস্ট [1])! = টাইপ (অ্যালিস্ট [2]) হলেও।

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


আমি যদি পারতাম তবে 15 বার এই উত্তরটি দিয়েছি। টিপলস সম্পর্কে আমি ঠিক এইরকম অনুভব করি।
অনুদান পল

6

তারা গুরুত্বপূর্ণ কারণ তারা কলারকে গ্যারান্টি দেয় যে তারা যে বস্তুটি পাস করবে তা রূপান্তরিত হবে না। আপনি যদি এটি করেন:

a = [1,1,1]
doWork(a)

কল করার পরে কলটির কোনও মানের কোনও গ্যারান্টি নেই । যাহোক,

a = (1,1,1)
doWorK(a)

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


1
এটি টিপলসের একটি খুব গৌণ সম্পত্তি। এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে আপনার কোনও পরিবর্তনযোগ্য অবজেক্ট রয়েছে যা আপনি কোনও ফাংশনে পাস করতে চান এবং এটি কোনও সংশোধন না করেই হোক না কেন, এটি প্রিফিক্সিং তালিকা বা অন্য কোনও শ্রেণি হোক। পাইথনে "রেফারেন্স অনুসারে কনস্ট প্যারামিটারগুলি" তেমন কোনও ধারণা নেই (উদাঃ কনস্ট ফু এবং সি ++ তে)। টিউপলগুলি এটি দেওয়ার জন্য ঘটে যদি কোনও টিপল আদৌ ব্যবহার করা সুবিধাজনক বলে মনে হয় তবে আপনি যদি আপনার কলারের কাছ থেকে একটি তালিকা পেয়ে থাকেন তবে আপনি অন্য কোথাও যাওয়ার আগে সত্যই এটিকে একটি টুপলে রূপান্তর করতে চলেছেন?
গ্লেন মেইনার্ড

আমি যে আপনার সাথে একমত। একটি টিপল কনস্ট্যান্ড কীওয়ার্ডে চড় মারার মতো নয়। আমার বক্তব্যটি হল যে একটি টিউপলের অপরিবর্তনীয়তা কোডের পাঠকের কাছে অর্থ যুক্ত করে। উভয়ই কাজ করবে এমন একটি পরিস্থিতি দেওয়া এবং আপনার প্রত্যাশাটি হ'ল
টিপলটি

a = [1,1,1] doWork (a) যদি ডাউরক () কে ডিফ ডোরক (আরগ) হিসাবে সংজ্ঞায়িত করা হয়: আরগ = [0,0,0] একটি তালিকায় ডাউরক () ডুবে যায় বা ফলাফল একই হয়
পাইনিউগুই


1

আপনার প্রশ্ন (এবং ফলো-আপ মন্তব্য) একটি অ্যাসাইনমেন্টের সময় আইডি () পরিবর্তন করে কিনা তা ফোকাস করে। পার্থক্যটির চেয়ে স্থাবর বস্তু প্রতিস্থাপন এবং পরিবর্তনীয় অবজেক্ট পরিবর্তনের মধ্যে পার্থক্যের এই ফলো-অন প্রভাবের উপর দৃষ্টি নিবদ্ধ করা সম্ভবত সেরা পন্থা নয়।

আমরা চালিয়ে যাওয়ার আগে, নিশ্চিত হয়ে নিন যে নীচের চিত্রটি আচরণ করা আপনার পাইথনের কাছ থেকে প্রত্যাশা।

>>> a1 = [1]
>>> a2 = a1
>>> print a2[0]
1
>>> a1[0] = 2
>>> print a2[0]
2

এই ক্ষেত্রে, a2 এর বিষয়বস্তু পরিবর্তন করা হয়েছিল, যদিও শুধুমাত্র a1 এর জন্য একটি নতুন মান নির্ধারিত ছিল। নিম্নলিখিতগুলির সাথে বিপরীতে:

>>> a1 = (1,)
>>> a2 = a1
>>> print a2[0]
1
>>> a1 = (2,)
>>> print a2[0]
1

এই পরবর্তী ক্ষেত্রে, আমরা সম্পূর্ণ তালিকাটির বিষয়বস্তু আপডেট করার পরিবর্তে প্রতিস্থাপন করেছি। টিউপলসের মতো অপরিবর্তনীয় প্রকারের সাথে, এটি কেবলমাত্র অনুমোদিত আচরণ।

কেন এই ব্যাপার? আসুন বলি আপনার একটি ডিক আছে:

>>> t1 = (1,2)
>>> d1 = { t1 : 'three' }
>>> print d1
{(1,2): 'three'}
>>> t1[0] = 0  ## results in a TypeError, as tuples cannot be modified
>>> t1 = (2,3) ## creates a new tuple, does not modify the old one
>>> print d1   ## as seen here, the dict is still intact
{(1,2): 'three'}

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


অন্যরা যেমন উল্লেখ করেছে, অপরিবর্তনীয়তা = = হ্যাশাবিলিটি। সমস্ত টিপলস অভিধান কী হিসাবে ব্যবহার করা যায় না: {([1], [2]): 'মান' ails ব্যর্থ হয় কারণ টিপলটিতে পরিবর্তিত তালিকাগুলি পরিবর্তন করা যায় তবে {((1), (2)): ' মান 'OK ঠিক আছে।
নেড ডিলি

নেড, এটি সত্য, তবে আমি নিশ্চিত নই যে প্রশ্নটি জিজ্ঞাসা করা হচ্ছে তার মধ্যে পার্থক্যটি জার্মানি।
চার্লস ডাফি

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

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