দুটি ভেরিয়েবল পাইথনে একই অবজেক্টকে রেফারেন্স করে তবে তুলনা করুন


94

দুটি ভেরিয়েবল একই বস্তুকে রেফারেন্স করে কিনা তা কীভাবে পরীক্ষা করবেন?

x = ['a', 'b', 'c']
y = x                 # x and y reference the same object
z = ['a', 'b', 'c']   # x and z reference different objects

উত্তর:


134

এটাই তার isজন্য: যদি একই জিনিস হয় এবং x is yফেরত দেয় ।Truexy


6
উদাহরণস্বরূপ, x is zরিটার্ন False। তবে যদি x এবং z তালিকাগুলির পরিবর্তে একই মান নির্ধারণ করা হয় (উদাহরণস্বরূপ x, z = 13, 13) তারপরে x is zফিরে আসে True। তা কেন?
বিল

12
@ বিল: পাইথন কীভাবে ইনটগুলি পরিচালনা করে তার এটি একটি প্রত্নতত্ত্ব। পাইথন পূর্ণসংখ্যক অবজেক্টগুলিকে কোন xএবং zবিন্দুতে বরাদ্দ করে । যেহেতু ছোট পূর্ণসংখ্যার ব্যর্থতা সাধারণ (-১ ত্রুটির মান হিসাবে 0, আপনি যখন কোনও কিছুকে সূচক হিসাবে দেখেন ঠিক তখন ছোট সংখ্যা সাধারণত যুক্তিসঙ্গত ডিফল্ট মান হয়) পাইথন ছোট সংখ্যার (-5 থেকে 256) পূর্বনির্ধারণের মাধ্যমে অপ্টিমাইজ করে এবং একই সংখ্যার অবজেক্টটিকে পুনরায় ব্যবহার করে। সুতরাং আপনার উদাহরণটি কেবল এই সীমাতে সংখ্যার জন্য কাজ করে। আরও বড় কিছু অর্পণ করার চেষ্টা করুন, যেমন 270। আরও তথ্যের টি দেখতে এখানে
টেড

4
পছন্দ করুন isদুটি নাম একই মেমরি অবস্থান উল্লেখ করে কিনা পরীক্ষা করে। বস্তুর সাথে এটির কোনও সম্পর্ক নেই। স্ট্রিংগুলির মতো প্রতিরক্ষাযোগ্য বস্তু রাখা সহজ যা একই জায়গায় সংরক্ষণ করা হয় না, উদাহরণস্বরূপ ''a'*10000 is 'a' * 10000মিথ্যা।
জোচেন রিটেল

4
@ জোচেনরিটজেল আপনি সম্পূর্ণই সঠিক, এই মন্তব্যের জন্য আপনাকে ধন্যবাদ! তাহলে, আমি যা দিয়ে যাচ্ছি তা পাই না "af" is "af"বা () is ()... তারা কেন একই মেমরির অবস্থান ভাগ করে?
AndresR

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


11

প্রতিটি ভেরিয়েবলের নামটি কোন অনন্য বস্তুকে বোঝায় তা পরীক্ষা করতে আপনি আইডি () ও ব্যবহার করতে পারেন ।

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)

আইডির ব্যবহার সম্পর্কে @ টেডের নোটটি এখানে বেশ প্রাসঙ্গিক।
লিও উফিমটসেভ

11

যদিও দুটি সঠিক সমাধান 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

পাইথন 3.6: এ = 98765; খ = 98765; a is b => সত্য। দৃশ্যত কিছু পরিবর্তন হয়েছে changed
মিখাইল কালাশনিকভ

@ মিখাইলকালাশনিকভ নোপ আমি পাইথন 3.6.2 এ পরীক্ষা করেছি, এটি এখনও বিদ্যমান exists
নিক্স

অজগরটি এখনও 3.7.7 এ বিদ্যমান রয়েছে
বিল হুয়াং

2

আমি সত্যিই একটি ভিজ্যুয়াল প্রতিক্রিয়া রাখতে চাই, সেই কারণেই আমি কখনও কখনও কেবল http://www.pythontutor.com/visualize.html#mode=ed এ খুলি মেমরিটি কীভাবে বরাদ্দ করা হয় এবং কী কী উল্লেখ করা হয় তা দেখার জন্য।

এখানে চিত্র বর্ণনা লিখুন

এই উত্তরটি দেখার জন্য হ'ল এই চমত্কার জিএফ যুক্ত করা হয়েছে ..


2

এটি ডকস.প্যাথন.আর.আর্গ থেকে: "প্রতিটি বস্তুর একটি পরিচয়, একটি ধরণ এবং মান থাকে An বস্তুর পরিচয় তৈরি হওয়ার পরে কখনও পরিবর্তন হয় না; আপনি এটিকে স্মৃতিতে বস্তুর ঠিকানা হিসাবে ভাবতে পারেন ' দুটি বস্তুর পরিচয় তুলনা করে; আইডি () ফাংশনটি তার পরিচয় উপস্থাপন করে এমন একটি পূর্ণসংখ্যা দেয় ""

স্পষ্টতই আপনি প্রতিবার মান পরিবর্তন করলে পরিচয়টি পরিবর্তনের মাধ্যমে নির্দেশিত হিসাবে অবজেক্টটি পুনরায় তৈরি করা হয়। X = 3 রেখাটি x = 3.14 রেখাটি অনুসরণ করে ত্রুটি দেয় না এবং x এর জন্য বিভিন্ন পরিচয়, প্রকার এবং মান দেয়।


4
দুর্দান্ত ডক ধরা।
prosti থেকে

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