উত্তর:
পাইথন ম্যানুয়াল এই সম্পর্কে বলার আছে id()
:
কোনও সামগ্রীর "পরিচয়" "ফিরিয়ে দিন This এটি একটি পূর্ণসংখ্যা (বা দীর্ঘ পূর্ণসংখ্যা) যা তার জীবদ্দশায় এই অবজেক্টটির জন্য অনন্য এবং ধ্রুবক হওয়ার নিশ্চয়তাযুক্ত- (বাস্তবায়ন দ্রষ্টব্য: এটি বস্তুর ঠিকানা))
সিপিথনে তাই এটিতে বস্তুর ঠিকানা হবে। যদিও অন্য কোনও পাইথন ইন্টারপ্রেটারের পক্ষে এরকম কোনও গ্যারান্টি নেই।
মনে রাখবেন যে আপনি যদি কোনও সি এক্সটেনশন লিখছেন, তবে পাইথন ইন্টারপ্রেটারের অভ্যন্তরীণগুলিতে সরাসরি অবজেক্টের ঠিকানায় অ্যাক্সেস সহ আপনার সম্পূর্ণ অ্যাক্সেস রয়েছে।
lifetime
(এবং আজীবন এর অর্থ কী overlap/not overlap
) বোঝায়?
আপনি এইভাবে ডিফল্ট পুনরায় প্রতিস্থাপন করতে পারেন:
def __repr__(self):
return '<%s.%s object at %s>' % (
self.__class__.__module__,
self.__class__.__name__,
hex(id(self))
)
return object.__repr__(self)
object.__repr__(obj)
__repr__ = object.__repr__
এবং এটি প্রায় বোকা প্রমাণ নয়, কারণ বিভিন্ন পরিস্থিতিতে এমনটি দেখা যায় যেখানে এটি কাজ করে না, যেমন একটি ওভাররাইড __getattribute__
বা একটি সিপিথন বাস্তবায়ন যেখানে আইডি নেই স্মৃতি অবস্থান। এটি জেড-ফিলও করে না, সুতরাং সিস্টেমটি 64 বিট হলে আপনাকে কাজ করতে হবে এবং প্রয়োজনীয়ভাবে শূন্যগুলি যুক্ত করতে হবে।
শুধু ব্যবহার
id(object)
id()
@ জেএলটি পরীক্ষা করতে পারেন
এখানে কয়েকটি সমস্যা রয়েছে যা অন্য কোনও উত্তর দ্বারা আবৃত নয়।
প্রথমত, id
কেবল ফেরত:
একটি বস্তুর "পরিচয়"। এটি একটি পূর্ণসংখ্যা (বা দীর্ঘ পূর্ণসংখ্যা) যা তার জীবদ্দশায় এই বিষয়টির জন্য অনন্য এবং ধ্রুবক হওয়ার গ্যারান্টিযুক্ত। না-ওভারল্যাপিং লাইফটাইমযুক্ত দুটি বস্তুর একই
id()
মান থাকতে পারে ।
সিপিথনে, এটি হ'ল পয়েন্টারটি PyObject
হ'ল যা দোভাষীগুলিতে বস্তুর প্রতিনিধিত্ব করে, যা একই জিনিসটি object.__repr__
প্রদর্শিত হয়। তবে এটি কেবলমাত্র পাইথনের বাস্তবায়ন বিশদ, সাধারণভাবে পাইথনের সত্য নয় something জাইথন পয়েন্টারগুলিতে ডিল করে না, এটি জাভা রেফারেন্সগুলিতে ডিল করে (যা অবশ্যই জেভিএম সম্ভবত পয়েন্টার হিসাবে উপস্থাপন করে, তবে আপনি সেগুলি দেখতে পারবেন না এবং চান না, কারণ জিসি তাদের চারপাশে স্থানান্তরিত করার অনুমতি দেয়)। পিপিআই বিভিন্ন ধরণের বিভিন্ন ধরণের অনুমতি দেয় id
তবে সর্বাধিক সাধারণ কেবল আপনি যে বস্তুর ডেকে পাঠিয়েছেন তার একটি সারণীতে সূচকid
চালু, যা স্পষ্টতই একটি পয়েন্টার হতে যাচ্ছে না। আমি আয়রন পাইথন সম্পর্কে নিশ্চিত নই, তবে আমি সন্দেহ করি এটি এ ক্ষেত্রে সিপিথনের মতো জাইথনের মতো। সুতরাং, বেশিরভাগ পাইথন বাস্তবায়নে, যা প্রদর্শিত হয়েছিল তা পাওয়ার কোনও উপায় repr
নেই এবং আপনি যদি তা করেন তবে কোনও ব্যবহার নেই।
তবে আপনি যদি কেবল সিপিথনকেই যত্নবান করেন? এটি সর্বোপরি একটি সাধারণ ঘটনা।
ঠিক আছে, প্রথমে, আপনি লক্ষ্য করতে পারেন যে id
এটি একটি পূর্ণসংখ্যা; * যদি আপনি 0x2aba1c0cf890
সংখ্যার পরিবর্তে সেই স্ট্রিংটি চান তবে আপনাকে 46978822895760
এটি নিজেই ফর্ম্যাট করতে হবে। প্রচ্ছদের অধীনে, আমি বিশ্বাস করি object.__repr__
শেষ পর্যন্ত printf
এর %p
ফর্ম্যাটটি ব্যবহার করা হচ্ছে , যা পাইথন থেকে আপনার নেই ... তবে আপনি সর্বদা এটি করতে পারেন:
format(id(spam), '#010x' if sys.maxsize.bit_length() <= 32 else '#18x')
* 3.x এ, এটি একটি int
। ২.x এ, এটি int
পয়েন্টার ধরে রাখার মতো যথেষ্ট বড় যদি এটি হয় - এটি কোনও প্ল্যাটফর্মের সাইনড নম্বর ইস্যু এবং long
অন্য কোনও কারণে নয়।
এই পয়েন্টারগুলি মুদ্রণ করার পাশাপাশি আপনি কি কিছু করতে পারেন? অবশ্যই (আবার, ধরে নিচ্ছেন আপনি কেবল সিপিথন সম্পর্কে যত্নশীল)।
সি এপিআইয়ের সমস্ত ফাংশন একটি PyObject
বা কোনও সম্পর্কিত ধরণের কাছে একটি পয়েন্টার নেয় । সম্পর্কিত সম্পর্কিত ধরণের জন্য, আপনি কেবল PyFoo_Check
এটি সত্যই কোনও Foo
বস্তু কিনা তা নিশ্চিত করতে কল করতে পারেন , তারপরে কাস্ট করুন (PyFoo *)p
। সুতরাং, আপনি যদি একটি সি এক্সটেনশন লিখছেন তবে id
আপনার যা প্রয়োজন তা হ'ল।
আপনি যদি খাঁটি পাইথন কোড লিখছেন? আপনি ঠিক একই ফাংশন pythonapi
থেকে কল করতে পারেন ctypes
।
অবশেষে, অন্যান্য উত্তর কয়েকটি নিয়ে এসেছে ctypes.addressof
। এটি এখানে প্রাসঙ্গিক নয়। এটি কেবলমাত্র জন্য কাজ করে ctypes
মত বস্তু c_int32
(এবং হয়ত কয়েক মেমরি বাফার মত বস্তু, দ্বারা উপলব্ধ মতো numpy
)। এবং এমনকি সেখানেও, এটি আপনাকে c_int32
মানটির ঠিকানা দিচ্ছে না , এটি আপনাকে সি-লেভেলের ঠিকানা দিচ্ছে int32
যা c_int32
মোড়ানো।
বলা হচ্ছে, প্রায়শই বলা যায় না, যদি আপনি সত্যিই মনে করেন যে আপনার কোনও কিছুর ঠিকানা প্রয়োজন, আপনি প্রথমে নেটিভ পাইথন অবজেক্টটি চান না, আপনি একটি ctypes
বস্তু চেয়েছিলেন ।
id
- seen
সেট বা cache
ডিকের পরিবর্তে পরিবর্তনীয় মান ধরে রাখতে তাদের ব্যবহার সহ অন্যান্য ব্যবহারগুলি - id
পয়েন্টার হওয়ার কোনও উপায়ের উপর নির্ভর করে না, বা কোনওভাবেই সম্পর্কিত নয় repr
। ঠিক এই কারণেই এই জাতীয় কোডটি কেবল সিপিথনে কাজ করার পরিবর্তে সমস্ত পাইথন বাস্তবায়নে কাজ করে।
id
এটির জন্য ব্যবহার করেছি, তবে আমার অর্থ এখনও জাভাতেও আপনি অবজেক্টের ঠিকানা পেতে পারেন, অদ্ভুত বলে মনে হচ্ছে (সি) পাইথনের কোনও উপায় নেই কারণ যেটির আসলে স্থিতিশীল জিসি রয়েছে যা বস্তুগুলিকে সরবে না সুতরাং ঠিকানা একই থাকে address
id
, এটি ঠিকানা হোক বা না হোক। উদাহরণস্বরূপ, পাইপাইতে সিপিথনের id
কী হিসাবে এখনও দরকারী, যদিও এটি সাধারণত বাস্তবায়নের কোনও গোপন টেবিলের জন্য একটি সূচক হয় তবে একটি পয়েন্টারটি অকেজো হয়ে যায়, কারণ (জাভার মতো) বস্তুটি সরানো যেতে পারে স্মৃতি.
id
কোনও বস্তুর মেমরির মধ্যে বস্তুর অবস্থানের নির্দেশক। সুতরাং, সিপিথন-নির্দিষ্ট কোডে যদি আপনার পয়েন্টার ভ্যালু (যা আপনি প্রায়শই করেন না, যেমনটি উত্তরেও ব্যাখ্যা করা হয়েছে) এর জন্য আপনার কোনও ব্যবহার থাকে, তবে এটি ডকুমেন্টেড এবং কাজের গ্যারান্টিযুক্ত এটি পাওয়ার একটি উপায় রয়েছে।
টর্স্টেনের প্রতিক্রিয়া হিসাবে, আমি addressof()
একটি নিয়মিত পাইথন অবজেক্টে কল করতে পারিনি । তদ্ব্যতীত id(a) != addressof(a)
,। এটি সিপাইটিতে রয়েছে, অন্য কিছুর বিষয়ে জানেন না।
>>> from ctypes import c_int, addressof
>>> a = 69
>>> addressof(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid type
>>> b = c_int(69)
>>> addressof(b)
4300673472
>>> id(b)
4300673392
সঙ্গে ctypes আপনার সাথে একই জিনিস অর্জন করতে পারেন
>>> import ctypes
>>> a = (1,2,3)
>>> ctypes.addressof(a)
3077760748L
ডকুমেন্টেশন:
addressof(C instance) -> integer
সি উদাহরণ অভ্যন্তরীণ বাফারের ঠিকানাটি ফিরিয়ে দিন
নোট করুন সিপিথনে, বর্তমানে id(a) == ctypes.addressof(a)
, তবে ctypes.addressof
প্রতিটি পাইথন বাস্তবায়নের জন্য আসল ঠিকানাটি ফেরত দেওয়া উচিত, যদি
সম্পাদনা করুন : টাইপগুলির দোভাষী-স্বাধীনতার সম্পর্কে তথ্য যুক্ত করা হয়েছে
TypeError: invalid type
যখন আমি পাইথন ৩.৪ দিয়ে চেষ্টা করি তখন ফলাফল হয় ।
আপনি এই উদ্দেশ্যে উপযুক্ত কিছু পেতে পারেন:
id(self)
আমি জানি এটি একটি পুরানো প্রশ্ন তবে আপনি যদি আজও অজগর 3 তে প্রোগ্রামিং করে থাকেন ... আমি আসলে খুঁজে পেয়েছি যে এটি যদি স্ট্রিং হয় তবে এটি করার সহজ উপায় আছে:
>>> spam.upper
<built-in method upper of str object at 0x1042e4830>
>>> spam.upper()
'YO I NEED HELP!'
>>> id(spam)
4365109296
স্ট্রিং রূপান্তর মেমরির মধ্যে অবস্থান প্রভাবিত করে না:
>>> spam = {437 : 'passphrase'}
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'
>>> str(spam)
"{437: 'passphrase'}"
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'
যদিও এটা এটা সত্য id(object)
ডিফল্ট CPython বাস্তবায়নের বস্তুর ঠিকানা পায়, এই সাধারণত অনর্থক ... তুমি করতে পারবে না কি বিশুদ্ধ পাইথন কোড থেকে ঠিকানা নিয়ে কিছু।
আপনি কেবলমাত্র ঠিকানাটি ব্যবহার করতে সক্ষম হবেন এটি কোনও সি এক্সটেনশান লাইব্রেরি থেকে ... সেই ক্ষেত্রে পাইথন অবজেক্টগুলি সর্বদা সি পয়েন্টার হিসাবে সর্বদা পাস করার কারণে অবজেক্টের ঠিকানা পাওয়া তুচ্ছ।
ctypes
যদি না স্ট্যান্ডার্ড লাইব্রেরিতে বিল্ট-ইন টুলকিট ব্যবহার না করেন। সেক্ষেত্রে আপনি ঠিকানা দিয়ে সমস্ত ধরণের কাজ করতে পারেন :)