আইডি () ফাংশনটি কী জন্য ব্যবহৃত হয়?


104

আমি পাইথন 2 ডক্স পড়েছি এবং id()ফাংশনটি লক্ষ্য করেছি :

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

সিপিথন বাস্তবায়নের বিশদ: এটি মেমরির অবজেক্টের ঠিকানা।

সুতরাং, আমি id()একটি তালিকা ব্যবহার করে পরীক্ষা করেছি :

>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12

ফাংশন থেকে পূর্ণসংখ্যাটি কী হবে? এটি কি সি-তে মেমরি ঠিকানার সমার্থক? যদি তাই হয় তবে কেন পূর্ণসংখ্যাটি ডেটা টাইপের আকারের সাথে মিলে না?

id()অনুশীলনে কখন ব্যবহৃত হয়?


4
আপনি কোনও স্ক্রিপ্টিং ভাষায় ডেটা স্ট্রাকচারে 32 বিট ইনট সংরক্ষণ করার কারণে (বলুন) এর অর্থ এই নয় যে আপনি 32 বিট বেশি মেমরি ব্যবহার করবেন। আপনার সঞ্চয় করা যে কোনও ডেটাতে সবসময়ই মেটাডেটা সংযুক্ত থাকে। প্রকার, আকার, দৈর্ঘ্য, ব্লা ব্লা ব্লা
মার্ক বি

সিপিথন এমন একটি গাদা থেকে বরাদ্দ দেয় যা বস্তুগুলি ম্যালোকড এবং ফ্রিড থাকায় স্ক্র্যাম্বল হয়ে যায়।
tdelaney

পাইথন সংখ্যাগুলি ডেটাগুলির সহজ টুকরো নয়। এগুলি এমন বস্তু যা শুরু করার জন্য অভ্যন্তরীণভাবে লম্বা সময় ব্যবহার করে, তারপরে যদি মানটি খুব বড় হয়ে যায় তবে বিগনम्बर-স্টাইলের উপস্থাপনায় স্বয়ংক্রিয়ভাবে প্রচার করুন।
গ্যারেথ লেটি

উত্তর:


159

আপনার পোস্টটি বেশ কয়েকটি প্রশ্ন জিজ্ঞাসা করে:

ফাংশন থেকে ফিরে আসা নম্বরটি কী?

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

সি তে মেমরি ঠিকানার সাথে কি একই রকম?

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

যদি হ্যাঁ, তবে তথ্যের ধরণের আকারের সাথে সাথে সংখ্যাটি তাত্ক্ষণিকভাবে কেন বাড়বে না (আমি ধরে নিই যে এটি অন্তর্ভুক্ত হবে)?

কারণ একটি তালিকা কোনও অ্যারে নয় এবং একটি তালিকা উপাদান একটি রেফারেন্স, কোনও অবজেক্ট নয়।

আমরা কখন id( )ফাংশন ব্যবহার করব ?

অতি বিরল. id()(বা এর সমতুল্য) isঅপারেটরে ব্যবহৃত হয় ।


আমরা সাধারণত এখানে স্ট্যাকওভারফ্লো
নবীন

51

এটি মেমরির মধ্যে অবজেক্টের অবস্থানের পরিচয় ...

এই উদাহরণটি আপনাকে ধারণাটি আরও কিছুটা বুঝতে সহায়তা করবে।

foo = 1
bar = foo
baz = bar
fii = 1

print id(foo)
print id(bar)
print id(baz)
print id(fii)

> 1532352
> 1532352
> 1532352
> 1532352

এগুলি সমস্ত স্মৃতিতে একই অবস্থানকে নির্দেশ করে, এ কারণেই তাদের মানগুলি একই। উদাহরণস্বরূপ, 1শুধুমাত্র একবারে সঞ্চয় করা হয় এবং অন্য 1যে কোনও কিছু নির্দেশ করে সেই মেমরির অবস্থানটি উল্লেখ করে।


10
তবে আপনি যদি -5 থেকে 256 এর সীমা ছাড়িয়ে নম্বরগুলি ব্যবহার করেন তবে আপনি ফাই ভেরিয়েবলের জন্য একই আইডি পাবেন না।
সৌরভ

এটি অত্যন্ত আকর্ষণীয় আপনি কি আরও ভাগ করতে পারেন?
jouell

4
আমি মনে করি যে এই উত্তরটি বিভ্রান্তিকর কারণ এটি বেশিরভাগ সংখ্যার পক্ষে সত্য হয় না; দেখতে পূর্ণসংখ্যার সঙ্গে অপারেটর আচরণ করবে অপ্রত্যাশিতভাবে "হয়"
কেভিনজি 6'19

9

id()রেফারেন্সযুক্ত (সিপিথনে) ঠিকানাটি ফেরৎ দেয় তবে আপনার বিভ্রান্তিটি সত্য থেকে আসে যে পাইথনের তালিকা সি অ্যারে থেকে খুব আলাদা। অজগর তালিকায় প্রতিটি উপাদান একটি উল্লেখ । সুতরাং আপনি যা করছেন তা এই সি কোডের সাথে অনেক বেশি মিল:

int *arr[3];
arr[0] = malloc(sizeof(int));
*arr[0] = 1;
arr[1] = malloc(sizeof(int));
*arr[1] = 2;
arr[2] = malloc(sizeof(int));
*arr[2] = 3;
printf("%p %p %p", arr[0], arr[1], arr[2]);

অন্য কথায়, আপনি রেফারেন্স থেকে ঠিকানাটি মুদ্রণ করছেন এবং আপনার তালিকাটি যেখানে সঞ্চিত আছে তার সাথে সম্পর্কিত কোনও ঠিকানা নয়

আমার ক্ষেত্রে, সি থেকে id()ফোন করার সময় সি কোডটিতে ফিরে আসার জন্য অস্বচ্ছ হ্যান্ডলগুলি তৈরি করার জন্য আমি কার্যকারিতাটি কার্যকর খুঁজে পেয়েছি pythonthat এটি করার পরে, আপনি সহজেই এর হ্যান্ডেল থেকে অবজেক্টটি সন্ধান করতে একটি অভিধান ব্যবহার করতে পারেন এবং এটি অনন্য হওয়ার গ্যারান্টিযুক্ত।


9

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

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

সম্প্রতি পাইথন / টিন্টার অ্যাপ্লিকেশনটির সাথে আমার এই সমস্যাটি হয়েছিল যেখানে একটি পাঠ্য প্রবেশের ক্ষেত্রের পাঠ্য সম্পাদনা করার সাথে আমি লেখার সাথে সাথে অন্য পাঠ্যকে পরিবর্তন করেছি :)

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

class democlass:
    classvar = 24

    def __init__(self, var):
        self.instancevar1 = var
        self.instancevar2 = 42

    def whoreferencesmylocalvars(self, fromwhere):
        return {__l__: {__g__
                    for __g__ in fromwhere
                        if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
                    }
                for __l__ in dir(self)
                    if not callable(getattr(self, __l__)) and __l__[-1] != '_'
                }

    def whoreferencesthisclassinstance(self, fromwhere):
        return {__g__
                    for __g__ in fromwhere
                        if not callable(__g__) and id(eval(__g__)) == id(self)
                }

a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2

print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )

আউটপুট:

My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}

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


দুর্দান্ত ব্যাখ্যা!
নীরজ ভার্মা

5

আমি পাইথন দিয়ে শুরু করছি এবং আমি আইডিটি ব্যবহার করি যখন আমি ইন্টারেক্টিভ শেলটি ব্যবহার করি তা দেখতে আমার ভেরিয়েবলগুলি একই জিনিস হিসাবে নির্ধারিত হয়েছে কিনা বা সেগুলি কেবল একই দেখায় see

প্রতিটি মান একটি আইডি, যা এটি কম্পিউটারের স্মৃতিতে সংরক্ষণ করা হয় যেখানে সম্পর্কিত একটি অনন্য নম্বর number


5

আপনি যদি পাইথন ৩.৪.১ ব্যবহার করছেন তবে আপনি আপনার প্রশ্নের আলাদা উত্তর পেয়ে যাবেন।

list = [1,2,3]
id(list[0])
id(list[1])
id(list[2])

ফেরত:

1705950792   
1705950808  # increased by 16   
1705950824  # increased by 16

পূর্ণসংখ্যার -5থেকে 256একটি ধ্রুবক আইডি থাকা, এবং এটি একাধিক বার তার আইডি না বদলায়, সব অন্যান্য সংখ্যার অসদৃশ খুঁজে পাওয়ার আগে অথবা পরে তে এটি বিভিন্ন আইডি থাকা যে প্রতিটি সময় আপনি তা খুঁজে পেতে হবে। থেকে নম্বর -5থেকে 256বাড়িয়ে অনুক্রমে আইডি এর আছে এবং দ্বারা পৃথক 16

id()ফাংশন দ্বারা ফিরিয়ে দেওয়া সংখ্যা হ'ল মেমরিতে সঞ্চিত প্রতিটি আইটেমকে দেওয়া একটি অনন্য আইডি এবং এটি সি এর মেমরির অবস্থানের মতোই উপমা অনুসারে is


2

উত্তরটি অনেক বেশি কখনও নয়। আইডিগুলি মূলত পাইথনের অভ্যন্তরীণভাবে ব্যবহৃত হয়।

গড় পাইথন প্রোগ্রামার সম্ভবত id()তাদের কোড ব্যবহার করার প্রয়োজন হবে না ।


4
সম্ভবত আমি গড় না, তবে আমি id()বেশ খানিকটা ব্যবহার করি । আমার মাথার উপরের দিক থেকে দুটি ব্যবহারের কেস: একটি (হ্যান্ড-রোলড, অ্যাডহক) পরিচয় নির্দেশ এবং এমন কোনও সামগ্রীর repr()জন্য একটি কাস্টম যেখানে পরিচয় গুরুত্বপূর্ণ তবে ডিফল্টটি reprউপযুক্ত নয়।

5
@ ডেলান আমি যে সাধারণ ঘটনা তা নিয়ে তর্ক করব না।
গ্যারেথ ল্যাটি 20

2

isঅপারেটর কি না চেক করতে দুটি বস্তুর অভিন্ন (যেমন সমান বিরোধিতা) এটি ব্যবহার করে। আসল মানটি যা থেকে ফিরে আসে id()তা কখনও কোনও কিছুর জন্য ব্যবহৃত হয় না কারণ এর প্রকৃত কোনও অর্থ হয় না এবং এটি প্ল্যাটফর্ম নির্ভর।


2

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

সুতরাং, আপনি যদি ভাষাটিতে পরম গুরু না হন তবে আপনি পূর্ববর্তী উপাদানগুলির উপর ভিত্তি করে আপনার তালিকার পরবর্তী উপাদানটির আইডি নির্ধারণ করতে পারবেন না, কারণ আপনি জানেন না যে উপাদানগুলির সাথে ভাষা কী বরাদ্দ করে।


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

আপনি যদি সম্ভাব্য মেমরি পরিচালকদের সহ এর সমস্ত ঘনত্বগুলি একেবারে জানেন তবে আপনি একজন পরম পাইথন গুরু।
লাজোস অর্পাদ

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

4
উল্লেখ করার মতো বিষয় নয়, এটি জানার অর্থহীন হবে যেহেতু এই জাতীয় জিনিসের উপর নির্ভর করা কোনও বাস্তবায়নের বিশদের উপর নির্ভর করে এবং তাই ভঙ্গুর এবং জটিল নয়।
গ্যারেথ লেটি

2

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


0

পাইথন হিসাবে 3 আইডি একটি ভেরিয়েবল নয় একটি মান নির্ধারিত হয়। এর অর্থ হ'ল যদি আপনি নীচের মত দুটি ফাংশন তৈরি করেন তবে তিনটি আইডিই একই রকম।

>>> def xyz():
...     q=123
...     print(id(q))
...
>>> def iop():
...     w=123
...     print(id(w))
>>> xyz()
1650376736
>>> iop()
1650376736
>>> id(123)
1650376736

যদিও এটি পূর্ববর্তী ব্যাখ্যাগুলির সাথে বিরোধিতা করে তবে মনে হয় এটি ঘটেছিল এবং কেন জানি না। কোন ব্যাখ্যা? উদাহরণস্বরূপ x [0] = "abc" x [1] = "Def" q = ["abc", "Def"]। আইডি (এক্স) == আইডি (কি) সত্য। কাকতালীয়?
ভিএমএমএফ

0

আমি কিছুটা দেরি করে পাইথন 3 নিয়ে কথা বলব। আইডি () কী এবং এটি (এবং পাইথন) কীভাবে কাজ করে তা বোঝার জন্য পরবর্তী উদাহরণটি বিবেচনা করুন:

>>> x=1000
>>> y=1000
>>> id(x)==id(y)
False
>>> id(x)
4312240944
>>> id(y)
4312240912
>>> id(1000)
4312241104
>>> x=1000
>>> id(x)
4312241104
>>> y=1000
>>> id(y)
4312241200

আপনাকে অবজেক্ট হিসাবে ডানদিকে থাকা সমস্ত কিছু সম্পর্কে ভাবতে হবে। যতবার আপনি অ্যাসাইনমেন্ট করবেন - আপনি নতুন অবজেক্ট তৈরি করেন এবং এর অর্থ নতুন আইডি। মাঝখানে আপনি একটি "বন্য" অবজেক্ট দেখতে পাবেন যা কেবলমাত্র ফাংশন - আইডি (1000) এর জন্য তৈরি হয়েছে। সুতরাং, এটির জীবনকাল কেবল কোডের সেই লাইনের জন্য। আপনি যদি পরবর্তী লাইনটি পরীক্ষা করেন - আপনি দেখতে পাচ্ছেন যে আমরা যখন নতুন ভেরিয়েবল এক্স তৈরি করব তখন এর বুনো বস্তুর মতো একই আইডি রয়েছে। খুব সুন্দর এটি মেমরি ঠিকানার মতো কাজ করে।


0

সাবধান থাকুন (ঠিক নীচে উত্তর সম্পর্কে) ... এটি কেবল সত্য কারণ 123 -5 থেকে 256 এর মধ্যে ...

In [111]: q = 257                                                         

In [112]: id(q)                                                            
Out[112]: 140020248465168

In [113]: w = 257                                                         

In [114]: id(w)                                                           
Out[114]: 140020274622544

In [115]: id(257)                                                         
Out[115]: 140020274622768
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.