দুটি ভেরিয়েবল একই বস্তুকে রেফারেন্স করে কিনা তা কীভাবে পরীক্ষা করবেন?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
দুটি ভেরিয়েবল একই বস্তুকে রেফারেন্স করে কিনা তা কীভাবে পরীক্ষা করবেন?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
উত্তর:
এটাই তার isজন্য: যদি একই জিনিস হয় এবং x is yফেরত দেয় ।Truexy
x is zরিটার্ন False। তবে যদি x এবং z তালিকাগুলির পরিবর্তে একই মান নির্ধারণ করা হয় (উদাহরণস্বরূপ x, z = 13, 13) তারপরে x is zফিরে আসে True। তা কেন?
xএবং zবিন্দুতে বরাদ্দ করে । যেহেতু ছোট পূর্ণসংখ্যার ব্যর্থতা সাধারণ (-১ ত্রুটির মান হিসাবে 0, আপনি যখন কোনও কিছুকে সূচক হিসাবে দেখেন ঠিক তখন ছোট সংখ্যা সাধারণত যুক্তিসঙ্গত ডিফল্ট মান হয়) পাইথন ছোট সংখ্যার (-5 থেকে 256) পূর্বনির্ধারণের মাধ্যমে অপ্টিমাইজ করে এবং একই সংখ্যার অবজেক্টটিকে পুনরায় ব্যবহার করে। সুতরাং আপনার উদাহরণটি কেবল এই সীমাতে সংখ্যার জন্য কাজ করে। আরও বড় কিছু অর্পণ করার চেষ্টা করুন, যেমন 270। আরও তথ্যের টি দেখতে এখানে
isদুটি নাম একই মেমরি অবস্থান উল্লেখ করে কিনা পরীক্ষা করে। বস্তুর সাথে এটির কোনও সম্পর্ক নেই। স্ট্রিংগুলির মতো প্রতিরক্ষাযোগ্য বস্তু রাখা সহজ যা একই জায়গায় সংরক্ষণ করা হয় না, উদাহরণস্বরূপ ''a'*10000 is 'a' * 10000মিথ্যা।
"af" is "af"বা () is ()... তারা কেন একই মেমরির অবস্থান ভাগ করে?
y is xহবে True, y is zহবে False।
প্রতিটি ভেরিয়েবলের নামটি কোন অনন্য বস্তুকে বোঝায় তা পরীক্ষা করতে আপনি আইডি () ও ব্যবহার করতে পারেন ।
In [1]: x1, x2 = 'foo', 'foo'
In [2]: x1 == x2
Out[2]: True
In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)
In [4]: x2 = 'foobar'[0:3]
In [5]: x2
Out[5]: 'foo'
In [6]: x1 == x2
Out[6]: True
In [7]: x1 is x2
Out[7]: False
In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
যদিও দুটি সঠিক সমাধান x is zএবং id(x) == id(z)ইতিমধ্যে পোস্ট করা হয়েছে, আমি পাইথনের একটি বাস্তবায়ন বিশদটি উল্লেখ করতে চাই। পাইথন বস্তু হিসাবে পূর্ণসংখ্যা সংরক্ষণ করে, একটি অপ্টিমাইজেশন হিসাবে এটি তার শুরুতে (-5 থেকে 256) ছোট ছোট পূর্ণসংখ্যার উত্পন্ন করে এবং প্রতিটি প্রাক-ভেরিয়েবলকে পূর্বনির্ধারিত অবজেক্টগুলির জন্য একটি ছোট মান সহ একটি পূর্ণসংখ্যার বিন্দুতে চিহ্নিত করে। অধিক তথ্য
এর অর্থ এটি হ'ল একই সংখ্যার (-5 থেকে 256) পূর্ণ সংখ্যার অবজেক্টের জন্য যদি দুটি বস্তু একই হয় তবে তা সত্য হবে ( সি সি পাইহনের উপর , যতদূর আমি অবগত আছি এটি একটি বাস্তবায়নের বিশদ ), তবে বৃহত্তর জন্য সংখ্যাগুলি কেবলমাত্র সত্যটি প্রত্যাশিত হয় যদি একটি অবজেক্টটি অন্যটির সাথে সূচনা হয়।
> i = 13
> j = 13
> i is j
True
> a = 280
> b = 280
> a is b
False
> a = b
> a
280
> a is b
True
আমি সত্যিই একটি ভিজ্যুয়াল প্রতিক্রিয়া রাখতে চাই, সেই কারণেই আমি কখনও কখনও কেবল http://www.pythontutor.com/visualize.html#mode=ed এ খুলি মেমরিটি কীভাবে বরাদ্দ করা হয় এবং কী কী উল্লেখ করা হয় তা দেখার জন্য।
এই উত্তরটি দেখার জন্য হ'ল এই চমত্কার জিএফ যুক্ত করা হয়েছে ..
এটি ডকস.প্যাথন.আর.আর্গ থেকে: "প্রতিটি বস্তুর একটি পরিচয়, একটি ধরণ এবং মান থাকে An বস্তুর পরিচয় তৈরি হওয়ার পরে কখনও পরিবর্তন হয় না; আপনি এটিকে স্মৃতিতে বস্তুর ঠিকানা হিসাবে ভাবতে পারেন ' দুটি বস্তুর পরিচয় তুলনা করে; আইডি () ফাংশনটি তার পরিচয় উপস্থাপন করে এমন একটি পূর্ণসংখ্যা দেয় ""
স্পষ্টতই আপনি প্রতিবার মান পরিবর্তন করলে পরিচয়টি পরিবর্তনের মাধ্যমে নির্দেশিত হিসাবে অবজেক্টটি পুনরায় তৈরি করা হয়। X = 3 রেখাটি x = 3.14 রেখাটি অনুসরণ করে ত্রুটি দেয় না এবং x এর জন্য বিভিন্ন পরিচয়, প্রকার এবং মান দেয়।
xএকটি হল নাম একটি চিহ্নিতকরণের বস্তুর একটি সঙ্গে মান এর 3একটি না বস্তুর নিজেই। যখন তুমি করেছ x=3.14, আপনি পরিবর্তন না করে বস্তুর যা পূর্বে চিহ্নিত করেছে x- আপনি পরিবর্তিত যা অবজেক্ট নাম x উল্লেখ ছিল।