অপরিবর্তনীয় বনাম পরিবর্তনীয় প্রকারের


184

অপরিবর্তনীয় ধরণ কী তা নিয়ে আমি বিভ্রান্ত। আমি জানি যে floatবিষয়টি আমার বইয়ের এই ধরণের উদাহরণ সহ অপরিবর্তনীয় বলে মনে করা হচ্ছে:

class RoundFloat(float):
    def __new__(cls, val):
        return float.__new__(cls, round(val, 2))

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

class SortedKeyDict(dict):
    def __new__(cls, val):
        return dict.__new__(cls, val.clear())

শ্রেণীর অভ্যন্তরে পরিবর্তিত কিছু কিছুর জন্য এই ধরণের উদাহরণ রয়েছে:

class SortedKeyDict_a(dict):
    def example(self):
        return self.keys()

এছাড়াও, শেষের জন্য class(SortedKeyDict_a), যদি আমি এই ধরণের সেটটি পাস করি:

d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))

exampleপদ্ধতিটি কল না করে এটি একটি অভিধান প্রদান করে। SortedKeyDictসঙ্গে __new__একটি ত্রুটি যেমন পতাকা এটা। আমি RoundFloatক্লাসে পূর্ণসংখ্যার সাথে পাস করার চেষ্টা করেছি __new__এবং এটি কোনও ত্রুটি চিহ্নিত করেছে।


আপনি [:] এবং পাইথন সহ লিস্ট অ্যাসাইনমেন্টও চেক আউট করতে পারেন কপি কপি ব্যবহার করার সময় যা আমি উত্তর পরিবর্তন সম্পর্কে আরও তথ্যের জন্য উত্তরও দিয়েছিলাম।
agf

উত্তর:


230

কি? ভাসমান কি অপরিবর্তনীয়? তবে আমি পারি না

x = 5.0
x += 7.0
print x # 12.0

"মিউট" এক্স না?

ভাল আপনি সম্মত স্ট্রিং অপরিবর্তনীয় অধিকার? তবে আপনি একই জিনিস করতে পারেন।

s = 'foo'
s += 'bar'
print s # foobar

ভেরিয়েবলের মান পরিবর্তিত হয় তবে ভেরিয়েবলটি কী বোঝায় তা পরিবর্তন করে এটি পরিবর্তিত হয়। একটি পরিবর্তনীয় প্রকারটি সেভাবে পরিবর্তন করতে পারে এবং এটি "জায়গায়" পরিবর্তন করতে পারে

এখানে পার্থক্য।

x = something # immutable type
print x
func(x)
print x # prints the same thing

x = something # mutable type
print x
func(x)
print x # might print something different

x = something # immutable type
y = x
print x
# some statement that operates on y
print x # prints the same thing

x = something # mutable type
y = x
print x
# some statement that operates on y
print x # might print something different

কংক্রিট উদাহরণ

x = 'foo'
y = x
print x # foo
y += 'bar'
print x # foo

x = [1, 2, 3]
y = x
print x # [1, 2, 3]
y += [3, 2, 1]
print x # [1, 2, 3, 3, 2, 1]

def func(val):
    val += 'bar'

x = 'foo'
print x # foo
func(x)
print x # foo

def func(val):
    val += [3, 2, 1]

x = [1, 2, 3]
print x # [1, 2, 3]
func(x)
print x # [1, 2, 3, 3, 2, 1]

5
আপনি যা ব্যাখ্যা করেন তা আমার কাছে বোঝায়: পরিবর্তনীয় ভেরিয়েবলগুলি রেফারেন্স দ্বারা পাস হয়, পরিবর্তনযোগ্য ভেরিয়েবলগুলি মান দ্বারা পাস হয়। এটা কি সঠিক ?
লরেঞ্জ মেয়ার

16
প্রায়, কিন্তু ঠিক না। প্রযুক্তিগতভাবে, সমস্ত ভেরিয়েবলগুলি পাইথনের রেফারেন্স দ্বারা পাস করা হয়, তবে সিটিক্সের মতো সিম্যান্টিকস পাসের মতো সি'র মতো পাসের মতো থাকে তবে আপনি যদি করেন তবে আপনার সাদৃশ্যটির প্রতিরূপ উদাহরণ def f(my_list): my_list = [1, 2, 3]। সি-তে পাস-রেফারেন্স সহ, যুক্তিটির মানটি সেই ফাংশনটিকে কল করে পরিবর্তন করতে পারে। পাইথনে, সেই ফাংশনটি কিছুই করে না। def f(my_list): my_list[:] = [1, 2, 3]কিছু করতে হবে।
সকাল সকাল

6
মিউটেবল টাইপগুলি জায়গায় পরিবর্তন করা যেতে পারে। অপরিবর্তনীয় ধরনের জায়গায় পরিবর্তন করতে পারবেন না। অজগর বিশ্বকে যেভাবে দেখে। ভেরিয়েবলগুলি ফাংশনে কীভাবে পাস হবে তা নির্বিশেষে।
ychaouche

13
পাইথনের শব্দার্থক এবং সি ++ পাস বাই বাই রেফারেন্স শব্দার্থের মধ্যে মূল পার্থক্য হ'ল অ্যাসাইনমেন্টটি পাইথনে রূপান্তর নয়, এবং এটি সি ++ এ রয়েছে। (তবে অবশ্যই যে, নিয়োগ বৃদ্ধি মত জটিল যে a += bকখনও কখনও হয় , পরিবর্তন। এবং সত্য একটি বড় বস্তুর অংশ নিয়োগ কখনও কখনও যে বৃহত্তর বস্তুর পরিবর্তন, শুধু কখনো পার্ট যেমন পরিব্যক্তি এর মানে হল যে a[0] = bপরিবর্তন ঘটান না a[0], তবে এটি সম্ভবত রূপান্তরিত করে a… এজন্য জিনিসগুলিকে সি ++ এর ভিত্তিতে না রাখার চেষ্টা করা আরও ভাল হতে পারে এবং তার পরিবর্তে পাইথন তার নিজের পদে কী করে তা বর্ণনা করে…)
অ্যাবার্নেট

2
আমি এই উত্তরটি বিভ্রান্তিমূলক পেয়েছি কারণ এটি আইডি () ব্যবহার করে না, যা অপরিবর্তনীয় মানে বোঝার জন্য প্রয়োজনীয় essential
পাওয়েল_উইনজিগ

183

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

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

>>> s = "abc"
>>>id(s)
4702124
>>> s[0] 
'a'
>>> s[0] = "o"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = "xyz"
>>>id(s)
4800100
>>> s += "uvw"
>>>id(s)
4800500

আপনি এটি একটি তালিকা দিয়ে করতে পারেন এবং এটি বস্তুর পরিচয় পরিবর্তন করবে না

>>> i = [1,2,3]
>>>id(i)
2146718700
>>> i[0] 
1
>>> i[0] = 7
>>> id(i)
2146718700

পাইথনের ডেটা মডেল সম্পর্কে আরও জানতে আপনার পাইথন ভাষার রেফারেন্সটি একবার দেখে নিতে পারেন:


4
পাইথন ডক্সের লিঙ্কের জন্য +1। তবে আমি বুঝতে পারি না হওয়া পর্যন্ত এটি আমাকে কিছুটা সময় নিয়েছে যখন আজ আপনাকে বিউথিন পাইথন 2 এবং 3 এর মধ্যে পার্থক্য করতে হবে - আমি জোর দিয়ে উত্তরটি আপডেট করেছি updated
বেনজমিন

106

প্রচলিত অপরিবর্তনীয় প্রকার:

  1. সংখ্যা: int(), float(),complex()
  2. অপরিবর্তনীয় সিকোয়েন্স: str(), tuple(), frozenset(),bytes()

প্রচলিত পরিবর্তনযোগ্য প্রকার (প্রায় সব কিছু):

  1. চপল সিকোয়েন্স: list(),bytearray()
  2. সেট টাইপ: set()
  3. ম্যাপিংয়ের ধরণ: dict()
  4. ক্লাস, বর্গ উদাহরণ
  5. প্রভৃতি

কোনও ট্রাইটি পরিবর্তনযোগ্য বা না তা দ্রুত পরীক্ষা করার জন্য একটি কৌশলটি id()অন্তর্নির্মিত ফাংশনটি ব্যবহার করা ।

উদাহরণস্বরূপ, পূর্ণসংখ্যার উপর ব্যবহার করে,

>>> i = 1
>>> id(i)
***704
>>> i += 1
>>> i
2
>>> id(i)
***736 (different from ***704)

তালিকায় ব্যবহার করে,

>>> a = [1]
>>> id(a)
***416
>>> a.append(2)
>>> a
[1, 2]
>>> id(a)
***416 (same with the above id)

11
ভাল করে বুঝিয়েছি। দ্বারা পরীক্ষা করার ধারণাটি পছন্দ করেছেন id()। +1 টি।
প্যারাগ তায়াগি

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

36

প্রথমত, কোনও শ্রেণীর পদ্ধতি রয়েছে বা তার শ্রেণিবদ্ধ কাঠামোটির কোনও পরিবর্তন নেই।

intগুলি এবং floatগুলি অপরিবর্তনীয় । যদি আমি করি

a = 1
a += 5

এটা তোলে নাম পয়েন্ট aএকটি এ 1প্রথম লাইন মেমরির কোথাও। দ্বিতীয় লাইন, এটি যে দেখায় 1, যোগ করে 5, পায় 6, তারপর পয়েন্ট aযে 6মেমরি - এটা করা হয়নি পরিবর্তন1 একটি থেকে 6অন্য কোন উপায়ে। একই যুক্তি নিম্নলিখিত উদাহরণ প্রযোজ্য, অন্য ব্যবহার অপরিবর্তনীয় প্রকারসমূহ:

b = 'some string'
b += 'some other string'
c = ('some', 'tuple')
c += ('some', 'other', 'tuple')

জন্য চপল ধরনের, আমি জিনিস যে actallly কি করতে পারেন যেখানে এটি মেমরি সংরক্ষিত রয়েছে মান পরিবর্তন । সঙ্গে:

d = [1, 2, 3]

আমি অবস্থানের একটি তালিকা তৈরি করেছি 1, 2এবং 3মেমরি। আমি যদি তারপর না

e = d

আমি শুধু বাতলান eথেকে একইlist d সময়ে পয়েন্ট। আমি তখন করতে পারি:

e += [4, 5]

এবং যে তালিকা eএবং dপয়েন্ট উভয়ই তালিকায় আপডেট হবে 4এবং 5মেমরির অবস্থানও থাকবে ।

যদি আমি কোনও পরিবর্তনযোগ্য টাইপটিতে ফিরে যাই এবং এটি দিয়ে এটি করি tuple:

f = (1, 2, 3)
g = f
g += (4, 5)

তারপরে fএখনও কেবলমাত্র মূলটিরtuple দিকেই নির্দেশ করুন - আপনি সম্পূর্ণ নতুনকে নির্দেশ gকরেছেন ।tuple

এখন, আপনার উদাহরণ সহ

class SortedKeyDict(dict):
    def __new__(cls, val):
        return dict.__new__(cls, val.clear())

আপনি যেখানে পাস

d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))

(ক যা tupleএর tuplesহিসাবে) valকারণ, আপনি একটি ত্রুটি পেয়ে থাকেন tupleকরা একটি না থাকে .clear()পদ্ধতি - আপনি পাস করতে হবে চাই dict(d)যেমন valকাজ তার জন্য, যে ক্ষেত্রে আপনি একটি খালি পাবেন SortedKeyDictফলে।


2
এটি খুব ভাল ব্যাখ্যা। এটি ব্যাখ্যা করতে এই প্রশ্ন এবং অনেক আকর্ষণীয় (নতুন) দৃষ্টিভঙ্গি পছন্দ করেছে।
বিজ্ঞানী

24

আপনি যদি অন্য কোন ভাষা থেকে পাইথনে আসেন (রুবির মতো পাইথনের মতো এটি বাদে) এবং অন্য ভাষার সাথে এটি বোঝার জন্য জোর দিয়ে থাকেন, এখানে লোকেরা সাধারণত বিভ্রান্ত হয়:

>>> a = 1
>>> a = 2 # I thought int was immutable, but I just changed it?!

পাইথনে, অ্যাসাইনমেন্ট পাইথনে রূপান্তর নয়।

সি ++ এ, আপনি লিখলে a = 2, আপনি কল করছেন a.operator=(2), যা সঞ্চিত অবজেক্টটিকে রূপান্তর করবে a। (এবং যদি কোনও বস্তু সঞ্চিত না থাকে তবে এটিa একটি ত্রুটি))

পাইথনে, a = 2যা কিছু সঞ্চিত ছিল তা কিছুই করে না a; এর ঠিক অর্থ 2এখন aপরিবর্তে সঞ্চিত । (এবং যদি কোনও বস্তু সঞ্চিত না থাকে তবে তাa ঠিক fine


শেষ পর্যন্ত, এটি আরও গভীর পার্থক্যের একটি অংশ।

সি ++ এর মতো কোনও ভাষার একটি পরিবর্তনীয় মেমরিতে টাইপ করা অবস্থান location যদি aএকটি হয় int, তার মানে এটা 4 বাইট কোথাও জানে যে কম্পাইলার একটি হিসেবে ব্যাখ্যা করা অনুমিত হয় int। সুতরাং, যখন আপনি এটি করেন a = 2, এটি মেমরির সেই 4 বাইটে কী থেকে সঞ্চিত তা পরিবর্তন 0, 0, 0, 1করে 0, 0, 0, 2। অন্য কোথাও অন্য কোনও int পরিবর্তনশীল থাকলে এর নিজস্ব 4 বাইট রয়েছে।

পাইথনের মতো ভাষায় একটি পরিবর্তনশীল এমন একটি জিনিসের নাম যা এর নিজস্ব জীবন ধারণ করে। সংখ্যার জন্য একটি অবজেক্ট এবং সংখ্যার 1জন্য অন্য একটি অবজেক্ট রয়েছে 2। এবং aমেমরির 4 বাইট নয় যা একটি হিসাবে প্রতিনিধিত্ব করা হয় int, এটি কেবল একটি নাম যা 1বস্তুর দিকে নির্দেশ করে । a = 21 নম্বরটিকে 2 নম্বরে পরিণত করার কোনও অর্থ হয় না (এটি কোনও পাইথন প্রোগ্রামারকে মহাবিশ্বের মৌলিক কার্যগুলিকে পরিবর্তনের জন্য খুব বেশি শক্তি দেয়); এটি পরিবর্তে কী করে তা কেবল বস্তুটি aভুলে যাওয়া 1এবং তার 2পরিবর্তে অবজেক্টের দিকে বিন্দু ।


সুতরাং, যদি অ্যাসাইনমেন্টটি কোনও মিউটেশন নয়, তবে কোনও রূপান্তর কী?

  • এমন কোনও পদ্ধতির কল করা যা মিউটেট করার জন্য নথিবদ্ধ থাকে, যেমন a.append(b)। (নোট করুন যে এই পদ্ধতিগুলি প্রায় সর্বদা ফিরে আসে None)। অপরিবর্তনীয় ধরণের এ জাতীয় কোনও পদ্ধতি নেই, সাধারণত পরিবর্তনীয় প্রকারগুলি করে।
  • যেমন a.spam = bবা মতামত একটি অংশ বরাদ্দ করা a[0] = b। অপরিবর্তনীয় প্রকারগুলি বৈশিষ্ট্য বা উপাদানগুলিকে অ্যাসাইনমেন্টের অনুমতি দেয় না, পরিবর্তনীয় প্রকারগুলি সাধারণত একটি বা অন্যটিকে মঞ্জুরি দেয়।
  • কখনও কখনও অগমেন্টেড অ্যাসাইনমেন্ট ব্যবহার করে, যেমন a += b, কখনও কখনও না। পরিবর্তনীয় প্রকারগুলি সাধারণত মানকে পরিবর্তন করে; অপরিবর্তনীয় প্রকারগুলি কখনই না করে এবং পরিবর্তে আপনাকে একটি অনুলিপি দেয় (তারা গণনা করে a + b, তারপরে ফলাফলটি নির্ধারণ করুন a)।

কিন্তু যদি অ্যাসাইনমেন্টটি মিউটেশন না হয় তবে অবজেক্টের মিউটেশনের অংশে কীভাবে বরাদ্দ করা হয়? যেখানে এটি কৃপণ হয়। a[0] = bনা না পরিবর্তন ঘটান a[0](আবার C ++ -এর মত), কিন্তু এটা না পরিবর্তন ঘটান a(গ অসদৃশ ++ পরোক্ষভাবে ছাড়া)।

এই সমস্ত কারণেই পাইথনের শব্দার্থক শব্দটিকে আপনি যে ভাষার ব্যবহার করছেন তা বিবেচনা করার চেষ্টা না করা এবং তার পরিবর্তে পাইথনের শব্দার্থক শব্দগুলি তাদের নিজস্ব শর্তে শিখাই ভাল।


2
বলুন a = 'হাই'। a [0] = 'f' এর একটি 'প্রিন্ট আউট' ফাই 'থাকবে (আমি এখনই ঠিক আছি?), সুতরাং যখন আপনি বলেন যে এটি কোনও [0] পরিবর্তিত করে না, বরং ক, এর অর্থ কী? ? একটি [এন] এরও এখন এটির নিজস্ব স্থান রয়েছে এবং এর মান পরিবর্তন করে এটি আলাদা মানকে নির্দেশ করে?
ড্যানিয়েল স্প্রিংগার

19

কোনও বস্তু পরিবর্তনযোগ্য কিনা তা তার ধরণের উপর নির্ভর করে। এটি নির্দিষ্ট পদ্ধতি রয়েছে কিনা বা শ্রেণিক শ্রেণিবিন্যাসের কাঠামোর উপর নির্ভর করে না।

ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি (অর্থাত ক্লাস) সাধারণত পরিবর্তনযোগ্য। কিছু ব্যতিক্রম রয়েছে, যেমন অপরিবর্তনীয় ধরণের সাধারণ উপ-শ্রেণি। অন্যান্য অপরিবর্তনীয় প্রকার আছে কিছু বিল্ট-ইন যেমন ধরনের int, float, tupleএবং str, ভাল কিছু পাইথন শ্রেণীর সি বাস্তবায়িত যেমন

পাইথন ল্যাঙ্গুয়েজ রেফারেন্সের "ডেটা মডেল" অধ্যায়টির একটি সাধারণ ব্যাখ্যা :

কিছু বস্তুর মান পরিবর্তন হতে পারে। যেসব বিষয়গুলির মান পরিবর্তন হতে পারে সেগুলিকে পরস্পর পরিবর্তনীয় বলে মনে করা হয়; যে বস্তুগুলির মান একবারে তৈরি হয়ে যায় সেগুলি অপরিবর্তনীয় বলা হয়।

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

একটি বস্তুর পরিবর্তনশীলতা তার ধরণ দ্বারা নির্ধারিত হয়; উদাহরণস্বরূপ, সংখ্যা, স্ট্রিং এবং টিপলগুলি অপরিবর্তনীয়, যখন অভিধান এবং তালিকা পারস্পরিক পরিবর্তনযোগ্য।


+1 নোট করুন যে কেবলমাত্র কয়েকটি এক্সটেনশন ধরণের (আপনি তার সংজ্ঞাটি পর্যালোচনা করতে চাইতে পারেন, পাইথনের সমস্ত বিল্টিন প্রকারগুলি সিতে প্রয়োগ করা হয়েছে) অপরিবর্তনীয়। অন্যেরা (বেশিরভাগই, আমি বলতে সাহস করব) পুরোপুরি পরিবর্তনযোগ্য।

@ ডেলান আপনি কি "এক্সটেনশনের ধরণ" বলছেন ?
eequem

@ এেকেম: আমি আমার উত্তরে "এক্সটেনশন প্রকার" শব্দটি ভুলভাবে ব্যবহার করেছি, এবং ডেলানান সেটিকে উল্লেখ করছে। তার মন্তব্যের পরে আমি আমার উত্তরটি সংশোধন করে এই শব্দটি ব্যবহার করা এড়িয়ে চললাম।
ট্যালিন্যাট

19

পরিবর্তনীয় এবং অপরিবর্তনীয় বস্তুর মধ্যে পার্থক্য

সংজ্ঞা

মিউটেবল অবজেক্ট : এটি তৈরি করার পরে যে বস্তুটি পরিবর্তন করা যেতে পারে।
অপরিবর্তনীয় অবজেক্ট : এমন বস্তু যা এটি তৈরির পরে পরিবর্তন করা যায় না।

পাইথনে অপরিবর্তনীয় বস্তুর মান পরিবর্তন করার চেষ্টা করবে এটি নতুন বস্তুকে দেবে।

পরিবর্তনীয় অবজেক্টস

পাইথনের তালিকার অবজেক্টগুলি এখানে পরিবর্তনীয় প্রকারের রয়েছে:

  1. list
  2. Dictionary
  3. Set
  4. bytearray
  5. user defined classes

অপরিবর্তনীয় বস্তু

পাইথনের তালিকার অবজেক্টগুলি এখানে অপরিবর্তনীয় টাইপের রয়েছে:

  1. int
  2. float
  3. decimal
  4. complex
  5. bool
  6. string
  7. tuple
  8. range
  9. frozenset
  10. bytes

কিছু উত্তরবিহীন প্রশ্ন

প্রশ্ন : স্ট্রিং একটি অপরিবর্তনীয় প্রকার?
উত্তর : হ্যাঁ , তবে আপনি এটি ব্যাখ্যা করতে পারেন: প্রমাণ 1 :

a = "Hello"
a +=" World"
print a

আউটপুট

"Hello World"

উপরের উদাহরণে স্ট্রিংটি একবার "হ্যালো" হিসাবে তৈরি হয়ে শেষ পর্যন্ত "হ্যালো ওয়ার্ল্ড" এ পরিবর্তিত হয়। এটি সূচিত করে যে স্ট্রিংটি পরিবর্তনীয় প্রকারের। তবে এটি নয় যে আমরা এর পরিচয় যাচাই করতে পারি এবং এটি পরিবর্তনীয় ধরণের কিনা তা পরীক্ষা করতে পারি।

a = "Hello"
identity_a = id(a)
a += " World"
new_identity_a = id(a)
if identity_a != new_identity_a:
    print "String is Immutable"

আউটপুট

String is Immutable

প্রমাণ 2 :

a = "Hello World"
a[0] = "M"

আউটপুট

TypeError 'str' object does not support item assignment

প্রশ্ন : টুপল কি অপরিবর্তনীয় প্রকার?
উত্তর : হ্যাঁ এটি প্রুফ 1 :

tuple_a = (1,)
tuple_a[0] = (2,)
print a

আউটপুট

'tuple' object does not support item assignment

[46]: এ = "হ্যালো" ইন [47]: আইডি (ক) আউট [47]: 140071263880128 ইন [48]: এ = এ.রপ্লেস ("এইচ", "জি") ইন [49]: এ [49]: 'জেলো' ইন [50]: আইডি (ক) আউট [50]: 140071263881040
আরগাস

আপনি কি আমার উপরোক্ত উদাহরণটিতে আপনার আইটেম অ্যাসাইনমেন্ট ইস্যুটির প্রমাণ দেওয়ার বিষয়ে চিন্তা করবেন
আরগাস

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

আপনার ক্ষেত্রে @ আরগাসমালওয়ার, প্রথম আইসিটি জিসি দ্বারা পুনর্ব্যবহারযোগ্য হওয়ার কারণে দুটি আইডি সমান, তাই দ্বিতীয়টি মেমরিটি পুনরায় ব্যবহার করে।
Kologler

11

একটি পরিবর্তনীয় অবজেক্টের অবজেক্টটিকে রূপান্তর করতে কমপক্ষে একটি পদ্ধতি থাকতে হবে। উদাহরণস্বরূপ, listঅবজেক্টটির appendপদ্ধতি রয়েছে যা আসলে বস্তুকে রূপান্তরিত করবে:

>>> a = [1,2,3]
>>> a.append('hello') # `a` has mutated but is still the same object
>>> a
[1, 2, 3, 'hello']

তবে ক্লাসের floatকোনও ভাসমান বস্তুকে রূপান্তরিত করার কোনও পদ্ধতি নেই। আপনি করতে পারেন:

>>> b = 5.0 
>>> b = b + 0.1
>>> b
5.1

তবে =অপারেন্ড কোনও পদ্ধতি নয়। এটি কেবল চলক এবং এটির ডানদিকে যা কিছু আছে তার মধ্যে একটি আবদ্ধতা তৈরি করে। এটি কখনও পরিবর্তন বা বস্তু তৈরি করে না। এটি ভেরিয়েবলটি কীসের দিকে ইঙ্গিত করবে তার একটি ঘোষণা, এখন থেকে।

আপনি যখন তা করবেন প্রতীক একটি নতুন ভাসা, কোনটা এর Te ফলাফল নিয়ে তৈরি করা হয় পরিবর্তনশীল binds ।b = b + 0.1=5 + 0.1

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

উভয় ক্ষেত্রেই, =কেবল বাঁধাই করা। এটি কোনও জিনিস পরিবর্তন করে না বা তৈরি করে না।

আপনি যখন করবেন a = 1.0, =অপারেন্ডটি ভাসাটি তৈরি করে না, তবে 1.0লাইনের অংশটি তৈরি করে। আসলে আপনি যখন লিখবেন 1.0এটি float(1.0)কোনও কনস্ট্রাক্টর কলটির জন্য একটি শর্টহ্যান্ড হ'ল ফ্লোট অবজেক্টটি ফেরত দেয়। (এ কারণেই যদি আপনি টাইপ করে 1.0এন্টার 1.0টিপেন তবে নীচে "ইকো" মুদ্রিত হবে; এটি আপনার বলা কনস্ট্রাক্টর ফাংশনের রিটার্ন মান)

এখন, যদি bএকটি float হয় এবং আপনি দায়িত্ব অর্পণ a = b, উভয় ভেরিয়েবল একই বস্তুর প্রতি নির্দেশ করা হয়, কিন্তু আসলে ভেরিয়েবল comunicate পারবনা betweem নিজেদের, কারণ বস্তুর inmutable, এবং যদি আপনি না b += 1, এখন bএকটি নতুন বস্তু পয়েন্ট, এবং aহয় এখনও পুরানোটির দিকে ইশারা করছে এবং কী bকী নির্দেশ করছে তা জানতে পারে না ।

তবে যদি cএটি হয় তবে ধরা যাক, একটি list, এবং আপনি a = cএখনই অর্পণ করেছেন aএবং c"কমুনিকেট" করতে পারেন, কারণ listপরিবর্তনযোগ্য এবং যদি আপনি c.append('msg')এটি করেন তবে কেবল aবার্তাটি পেয়েছেন তা পরীক্ষা করে দেখুন।

(যাইহোক, প্রতিটি বস্তুর একটি পৃথক আইডি নম্বর রয়েছে, আপনি যেভাবে পেতে id(x)পারেন So সুতরাং আপনি কোনও বিষয় একই কিনা এটির অনন্য আইডি পরিবর্তন হয়েছে কিনা তা যাচাই করে নিতে পারেন))


6

কোনও শ্রেণি অপরিবর্তনীয় যদি সেই শ্রেণীর প্রতিটি বস্তুর ইনস্ট্যান্টেশনের উপর একটি নির্দিষ্ট মান থাকে যা সাবস্কিয়েন্টলি পরিবর্তন করা যায় না

অন্য কথায় সেই ভেরিয়েবলের পুরো মান পরিবর্তন করুন (name)বা এটিকে একা রেখে দিন।

উদাহরণ:

my_string = "Hello world" 
my_string[0] = "h"
print my_string 

আপনি এটি হ্যালো ওয়ার্ল্ডের কাজ এবং মুদ্রণের জন্য প্রত্যাশা করেছিলেন তবে এটি নিম্নলিখিত ত্রুটিটি ফেলে দেবে:

Traceback (most recent call last):
File "test.py", line 4, in <module>
my_string[0] = "h"
TypeError: 'str' object does not support item assignment

দোভাষা বলছেন: আমি এই স্ট্রিংয়ের প্রথম চরিত্রটি পরিবর্তন করতে পারি না

stringএটি কার্যকরভাবে তৈরি করতে আপনাকে পুরো পরিবর্তন করতে হবে:

my_string = "Hello World" 
my_string = "hello world"
print my_string #hello world

এই টেবিলটি পরীক্ষা করুন:

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

উৎস


আপনি উপরে দেখানোর চেয়ে কীভাবে একটি অজগর স্ট্রিংয়ের উপাদানগুলি আরও সংক্ষিপ্ত আকারে পরিবর্তন করতে পারেন?
লুক ডেভিস

@LukeDavis আপনি কাজ করতে পারে my_string = 'h' + my_string[1:]। এটি my_string নামে একটি নতুন স্ট্রিং উত্পন্ন করবে এবং আসল my_string চলে গেছে ( id(my_string)এটি দেখতে মুদ্রণ করুন )। অবশ্যই এটি খুব নমনীয় নয়, আরও সাধারণ ক্ষেত্রে আপনি তালিকাতে এবং ফিরে রূপান্তর করতে পারেন:l = list(my_string) l[0] = 'h' my_string = ''.join(l)
ড্যানিও

5

আমার কাছে মনে হবে আপনি যে পরিবর্তনীয় / অপরিবর্তনীয় আসলে কী তা নিয়ে এই প্রশ্নের সাথে লড়াই করছেন । সুতরাং এখানে একটি সহজ ব্যাখ্যা:

ব্যাখ্যার ভিত্তিতে প্রথমে আমাদের একটি ভিত্তি প্রয়োজন।

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

উদাহরণস্বরূপ আপনি 0x110, 0xaf0278297319 বা অনুরূপ সংখ্যাগুলি নিয়ে ভাবেন না, তবে পরিবর্তে আপনি 6 এর মতো সংখ্যা বা "হ্যালো, ওয়ার্ল্ড" এর মতো স্ট্রিংগুলি সম্পর্কে ভাবেন। কখনই কম থিস সংখ্যা বা স্ট্রিং কম্পিউটার মেমোরিতে বাইনারি সংখ্যার ব্যাখ্যা নয়। ভেরিয়েবলের যে কোনও মানের ক্ষেত্রে এটি একই।

সংক্ষেপে: আমরা প্রকৃত মানগুলি নিয়ে নয় তবে প্রকৃত বাইনারি মানগুলির ব্যাখ্যা দিয়ে প্রোগ্রাম করি না

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

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

সুতরাং: যদি ভার্চুয়াল অবজেক্টে কোনও পরিবর্তন হওয়ার অর্থ এটি আসলে অন্য একটি ভার্চুয়াল অবজেক্টে পরিণত হয়, তবে একে অপরিবর্তনীয় বলা হয়।

চূড়ান্ত মন্তব্য:

(1) কখনই আপনার আসল-জগতের পরিবর্তনকে পরিবর্তনযোগ্য এবং অপরিবর্তনীয় অভিজ্ঞতা কোনও নির্দিষ্ট ভাষায় প্রোগ্রামিংয়ের সাথে মিশ্রিত করবেন না:

প্রতিটি প্রোগ্রামিং ভাষার নিজস্ব একটি সংজ্ঞা থাকে যার ভিত্তিতে কোন বস্তু নিঃশব্দ করা যায় এবং কোনটি নাও পারে।

সুতরাং আপনি যখন অর্থের পার্থক্যটি বুঝতে পারছেন তখনও আপনাকে প্রতিটি প্রোগ্রামিং ভাষার জন্য প্রকৃত বাস্তবায়ন শিখতে হবে। ... প্রকৃতপক্ষে এমন কোনও ভাষার একটি উদ্দেশ্য থাকতে পারে যেখানে 6 জনকে become. হয়ে উঠতে পারে Then তারপরে আবার এটি বেশ কিছু উন্মাদ বা আকর্ষণীয় জিনিস যেমন সমান্তরাল মহাবিশ্বের অনুকরণের মতো।

(২) এই ব্যাখ্যাটি অবশ্যই বৈজ্ঞানিক নয়, এটি আপনাকে পরিবর্তনীয় এবং অপরিবর্তনীয় মধ্যে পার্থক্য বুঝতে সাহায্য করার জন্য বোঝানো হয়েছে।


5

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

@ মিনা-গ্যাব্রিয়েলের একটি দরকারী পোস্ট অনুসারে:

উপরের বিশ্লেষণ এবং ডাব্লু / আরাকান দ্বারা পোস্টের সংমিশ্রণ:

অপ্রত্যাশিতভাবে কী পরিবর্তন হতে পারে?

  • স্কেলারগুলি (একক মান সংরক্ষণ করে পরিবর্তনশীল প্রকারগুলি) অপ্রত্যাশিতভাবে পরিবর্তন হয় না
    • সংখ্যার উদাহরণ: int (), ভাসা (), জটিল ()
  • কিছু "পরিবর্তনীয় ক্রম" রয়েছে:
    • str (), টিপল (), হিমায়িত (), বাইট ()

কি পারে?

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

"অপ্রত্যাশিতভাবে" দ্বারা আমি বোঝাতে চাইছি যে অন্যান্য ভাষার প্রোগ্রামাররা এই আচরণটি প্রত্যাশা করতে পারে না (ব্যতিক্রম বা রুবি বাদে এবং সম্ভবত আরও কয়েকটি "পাইথন লাইক" ভাষা)।

এই আলোচনায় যুক্ত করা:

এই আচরণটি তখন একটি সুবিধা যখন এটি দুর্ঘটনাক্রমে আপনার কোডটিকে মেমরির খাওয়ার বৃহত ডেটা স্ট্রাকচারের মাল্টিপল কপিগুলি সহ আপনার পপ করতে বাধা দেয়। কিন্তু যখন এটি অনাকাঙ্ক্ষিত হয়, তখন আমরা কীভাবে এটি ঘটাব?

তালিকাগুলি সহ, সহজ সমাধানটি হ'ল এর মতো একটি নতুন তৈরি করা:

list2 = list (list1)

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

আপনি পরিবর্তনীয় কাঠামোয় পাস করার সময় ফাংশনগুলি আসলটি পরিবর্তন করতে পারে। বলুন কিভাবে?

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

অ-মানক পদ্ধতির (সহায়ক ক্ষেত্রে): এটি একটি এমআইটি লাইসেন্সের অধীনে প্রকাশিত গিথুবে পাওয়া গেছে:

  • গিথুব সংগ্রহস্থলের অধীনে: টুবগু নামকরণ: পাইরসিস্ট্যান্ট
  • এটি কী: পাইউটন অবিচ্ছিন্ন ডাটা স্ট্রাকচার কোড লিখিত যখন ডেটা স্ট্রাকচারের জায়গায় পরিবর্তনের জন্য অবাঞ্ছিত হয়

কাস্টম ক্লাসগুলির জন্য, @ সেমিকোলন কোনও __hash__ফাংশন আছে কিনা তা পরীক্ষা করার পরামর্শ দেয় কারণ পারস্পরিক পরিবর্তনযোগ্য বস্তুগুলির সাধারণত একটি না থাকা উচিত__hash__() ফাংশন ।

এই মুহূর্তে আমি এই বিষয়টিতে জমা করেছি। অন্যান্য ধারণা, সংশোধন, ইত্যাদি স্বাগত। ধন্যবাদ।


3

পার্থক্যের চিন্তাভাবনার এক উপায়:

পাইথনের অপরিবর্তনীয় বস্তুগুলিকে অ্যাসাইনমেন্টগুলি গভীর অনুলিপি হিসাবে বিবেচনা করা যেতে পারে, অন্যদিকে পরিবর্তনযোগ্য বস্তুর অ্যাসাইনমেন্টগুলি অগভীর


1
এটি ভুল। পাইথনে সমস্ত অ্যাসাইনমেন্ট রেফারেন্স অনুসারে। এতে কোনও অনুলিপি জড়িত নেই।
আগস্ট

3

সহজ উত্তর:

একটি পরিবর্তনীয় ভেরিয়েবল হ'ল যার মান স্থানে পরিবর্তিত হতে পারে, তবে স্থাবর পরিবর্তনের সাথে মানের পরিবর্তন হয় না। অপরিবর্তনীয় ভেরিয়েবল পরিবর্তন করা একই চলকটি পুনর্নির্মাণ করবে।

উদাহরণ:

>>>x = 5

X দ্বারা রেফারেন্সযুক্ত একটি মান 5 তৈরি করবে

x -> 5

>>>y = x

এই বিবৃতিটি x এর 5 টি রেফারেন্স করবে

x -------------> 5 <----------- y

>>>x = x + y

এক্স হিসাবে পূর্ণসংখ্যা (অপরিবর্তনীয় টাইপ) হওয়ায় পুনঃনির্মাণ করা হয়েছে।

বিবৃতিতে, আরএইচএসে অভিব্যক্তি 10 এর মান হবে এবং যখন এটি এলএইচএস (এক্স) এ বরাদ্দ করা হবে, এক্স পুনরায় তৈরি হবে 10।

এক্স ---------> 10

Y ---------> 5


-1

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

আপনাকে একটি তালিকা তৈরি করতে বলুন

a = [1,2]

আপনি যদি বলতেন:

b = a
b[1] = 3

যদিও আপনি বিতে একটি মান পুনর্নির্দিষ্ট করেছেন, এটি একটিতে মানটিও পুনরায় বরাদ্দ করবে। এটি কারণ যখন আপনি "b = a" বরাদ্দ করেন। আপনি মানটির একটি অনুলিপি না দিয়ে বস্তুকে "রেফারেন্স" দিয়ে যাচ্ছেন। স্ট্রিং, ফ্লোটস ইত্যাদির ক্ষেত্রে এটি হয় না এটি তালিকা, অভিধান এবং পছন্দগুলি পরিবর্তনীয় করে তোলে, তবে বুলিয়ান, ভাসমান ইত্যাদি অপরিবর্তনীয়।


-1

অপরিবর্তনীয় বস্তুর জন্য, অ্যাসাইনমেন্ট মানগুলির একটি নতুন অনুলিপি তৈরি করে, উদাহরণস্বরূপ।

x=7
y=x
print(x,y)
x=10 # so for immutable objects this creates a new copy so that it doesnot 
#effect the value of y
print(x,y)

পরিবর্তনীয় বস্তুর জন্য, অ্যাসাইনমেন্টটি মানগুলির অন্য অনুলিপি তৈরি করে না। উদাহরণ স্বরূপ,

x=[1,2,3,4]
print(x)
y=x #for immutable objects assignment doesn't create new copy 
x[2]=5
print(x,y) # both x&y holds the same list

1
একেবারে ভুল। অ্যাসাইনমেন্ট কখনই একটি অনুলিপি তৈরি করে না । দয়া করে nedbatchelder.com/text/names.html পড়ুন প্রথম ক্ষেত্রে, x=10কেবল একটি অন্য কাজ , যখন x[2] = 5একটি মিউটর পদ্ধতিটি কল করে। intঅবজেক্টগুলিতে কেবল মিউটর পদ্ধতির অভাব হয় তবে পাইথন অ্যাসাইনমেন্টের শব্দার্থক
শব্দগুলির

-2

পাইথনে, এখানে জানার একটি সহজ উপায় রয়েছে:

অপরিবর্তনীয়:

    >>> s='asd'
    >>> s is 'asd'
    True
    >>> s=None
    >>> s is None
    True
    >>> s=123
    >>> s is 123
    True

চপল:

>>> s={}
>>> s is {}
False
>>> {} is {}
Flase
>>> s=[1,2]
>>> s is [1,2]
False
>>> s=(1,2)
>>> s is (1,2)
False

এবং:

>>> s=abs
>>> s is abs
True

সুতরাং আমি মনে করি বিল্ট-ইন ফাংশনটি পাইথনেও অপরিবর্তনীয়।

তবে ভাসা কীভাবে কাজ করে তা আমি সত্যিই বুঝতে পারি না:

>>> s=12.3
>>> s is 12.3
False
>>> 12.3 is 12.3
True
>>> s == 12.3
True
>>> id(12.3)
140241478380112
>>> id(s)
140241478380256
>>> s=12.3
>>> id(s)
140241478380112
>>> id(12.3)
140241478380256
>>> id(12.3)
140241478380256

তাই অদ্ভুত.


তবে এটি পরিষ্কারভাবে বৈধ নয়। কারণ টিপলস অপরিবর্তনীয়। টাইপ করুন x = (1, 2)এবং তারপরে চেষ্টা করুন এবং পরিবর্তন করুন x, এটি সম্ভব নয়। পরিবর্তনের জন্য যাচাই করার জন্য আমি খুঁজে পেয়েছি যে hashএটি অন্তত অন্তর্নির্মিত বস্তুর জন্য কাজ করে। hash(1) hash('a') hash((1, 2)) hash(True)সমস্ত কাজ, এবং hash([]) hash({}) hash({1, 2})সব কাজ করে না।
সেমিকোলন

@ সেমিকোলন ব্যবহারকারী-সংজ্ঞায়িত ক্লাসগুলির জন্য তখন hash()অবজেক্টটি কোনও __hash__()পদ্ধতি নির্ধারণ করে তবে কাজ করবে , যদিও ব্যবহারকারী-সংজ্ঞায়িত ক্লাসগুলি সাধারণত পরিবর্তনযোগ্য।
আগস্ট

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

1
@ অগুরার এবং সেমিকোলন (বা অন্যরা যদি তারা এটি জানেন): __হ্যাশ __ () সমাধান ... এটির জন্য কোনও কাস্টম শ্রেণির স্রষ্টাকে কি এটি যুক্ত করতে হবে? যদি তাই হয়, তবে বিধিটি বিদ্যমান থাকলে অবজেক্টটি অপরিবর্তনীয় হওয়া উচিত; যদি এটির অস্তিত্ব না থাকে তবে আমরা বলতে পারি না যেহেতু স্রষ্টা যদি বন্ধ থাকে তবে কেবল ছেড়ে যেতে পারেন।
টিএমডাব্লুপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.