Python 中每个实体都是对象,不可变意味着什么?与其他一些编程语言不同,您需要显式指定分配给变量的数据类型,而 Python 不需要这样做。相反,它会根据您提供的值自动分配数据类型。
简而言之,每个变量都保存一个对象实例,并被赋予一个在程序运行时创建的唯一对象 ID。对象 ID 是一个整数,表示存储变量值的内存位置。
要获取每个对象的 ID,您需要打开 Python Shell 并调用默认的 id() 函数并传递变量名称。这是一个例子:
#Initializing the variable a = "this is not a random string" #We call the id() function with the variable name as argument print ( "The Object id of 'a' is: " + str ( id (a))) |
输出:
以下输出代表
The Object id of 'a' is: 1695893310240 |
什么是不变性?
为了正确理解不可变性的概念,我们需要知道可变对象和不可变对象之间的区别。
什么是可变对象?
如果一个对象的状态在创建后可以改变,那么它就被称为可变对象。
例子:
下面我们将以下随机值列表分配给变量“ randomValues ”。创建后,我们检查并记下其对象 ID。然后,我们需要修改列表(这可以通过附加值、删除它们或简单地用其他值替换其中之一来实现)。然后我们再次记下对象 ID。
如果列表的对象 ID / 内存位置保持不变,那么我们可以说Python 列表的状态已更改。
# Our list of random values randomValues = [ "Bojack Horseman" , 42 , "Robert Langdon" , 1.61803 ] id1 = id (randomValues) # Modifying/Changing the state of our list randomValues[ 1 ] = "The answer to everything" randomValues.append( "I love Python" ) id2 = id (randomValues) # Compare the object id before and after modifying if id1 = = id2: print ( "The Object ID Remains the same." ) else : print ( "The Object ID changes." ) |
输出:
The Object ID Remains the same. |
我们可以看到,当值发生变化时,内存位置或列表的 ID 保持不变。这意味着Python为该位置分配了更多的内存空间来考虑附加值。
由此我们可以说列表是一个“可变”对象或可更改的对象。
什么是不可变对象?
如果一个对象的状态在创建后就不能改变,那么它被称为不可变对象。
示例1:
与之前的示例不同,我们使用列表进行操作,下面我们用随机值初始化一个元组。然后我们记下它的对象 ID。接下来,我们尝试修改元组并比较前后的对象 ID。
# Our tuple of random values randomValues = ( "Bojack Horseman" , 42 , "Robert Langdon" , 1.61803 ) id1 = id (randomValues) # Modifying/Changing the state of our tuple randomValues[ 1 ] = "The answer to everything" # Compare the object id before and after modifying if id1 = = id2: print ( "The Object ID Remains the same." ) else : print ( "The Object ID changes." ) |
输出:
TypeError: 'tuple' object does not support item assignment |
在这里我们看到元组(本质上不可变的类型)不支持修改其值或向其附加项目。那么,让我们继续对整数进行相同的操作。
示例2:
现在我们需要为任何变量分配一个简单的整数值并记下它的对象 ID。与前面的示例一样,我们为整数变量分配一个新值并比较对象 ID。
# first we assign an integer value to the variable randomNumber = 42 id1 = id (randomNumber) # Change the value of our integer variable randomNumber = 134 id2 = id (randomNumber) if id1 = = id2: print ( "The Object ID remains the same." ) else : print ( "The Object ID changed." ) |
输出:
The Object ID changed. |
在这里,我们可以清楚地注意到,在新的赋值之后,变量“randomNumber”的对象id也发生了变化。
意思是,它是一个比以前独立的对象。这不是原始对象状态的改变。
注意:当您为具有不可变对象的变量分配新值时,这会创建一个新对象,并且不会覆盖当前对象。
Python 中哪些对象是不可变的?
现在我们了解了Python 中不可变这个词的含义,让我们看看 Python 中哪些类型的对象是不可变的:
- 弦乐
- 整数
- 花车
- 元组
- 范围是元组
结论
不可变对象的主要好处之一是它们的访问速度比可变对象快得多。希望本文能帮助您理解 Python 中不可变对象的概念。