Python 中的“不可变”是什么意思?

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 中不可变对象的概念。

参考

https://docs.python.org/3/reference/datamodel.html