Python 中可变对象和不可变对象


在本文中,我们将向您解释 Python 中的可变对象和不可变对象。

Python 将所有内容都视为对象。当我们实例化一个对象时,会为其分配一个唯一的 ID。我们无法修改对象的类型,但可以更改其值。例如,如果我们将变量 a 设置为列表,则不能将其更改为元组/字典,但可以修改该列表中的条目。

在 Python 中,有两种类型的对象。一方面,有一些对象可以更改其内部状态(对象内部的数据/内容),即可以使用预定义函数或方法更改它们,另一方面,有一些对象无法更改其内部状态(对象内部的数据/内容)。

在 Python 中,有两种类型的对象:

  • 可变对象

  • 不可变对象。

总之,**可变**对象可以更改其状态或内容,但**不可变**对象则不能。

可变对象

可变对象是指在实例化后可以修改的对象。我们可以使用各种方法和函数来更改可变对象。当使用某些方法和函数时,原始对象会被修改。

在修改可变对象时,存储这些对象的内存保持不变。

Python 中可变对象的示例包括:

  • 列表

  • 字典

  • 集合

列表

列表是可变的,这意味着我们可以使用赋值运算符或索引运算符更改列表中的元素。

示例

# input list inputList = ['hello', 'tutorialspoint', 'python', 1] # printing the original input list print("The original input list:", inputList) # modifying the list element at index 2 using indexing inputList[2]= 'welcome' # printing input list after modifying print("Input list after modification:", inputList)

输出

执行上述程序将生成以下输出:

The original input list: ['hello', 'tutorialspoint', 'python', 1]
Input list after modification: ['hello', 'tutorialspoint', 'welcome', 1]

我们使用一些随机值创建了一个列表,然后用另一个随机值更改了列表中的一个元素;因为列表是可变数据类型,所以元素的值会发生更改,而不会引发任何错误。

字典

由于字典是可变的,因此我们可以使用内置函数 update() 更新它们。

示例

# input list inputList = ['hello', 'tutorialspoint', 'python', 1] # printing the original input list print("The original input list:", inputList) # modifying the element at index 2 using indexing inputList[2]= 'welcome' # printing input list after modifying print("Input list after modification:", inputList)

输出

执行上述程序将生成以下输出:

The original input list: ['hello', 'tutorialspoint', 'python', 1]
Input list after modification: ['hello', 'tutorialspoint', 'welcome', 1]

不可变对象

这些是内置类型,例如 **int、float、bool、string、unicode、冻结集** 和 **tuple**。换句话说,不可变对象一旦创建就无法修改。

当您对不可变对象进行更改时,会更新它们在初始化期间存储的内存。

int

由于 int 数据类型是不可变的,因此我们无法修改或更新它。

如前所述,不可变对象在更新时会更改其内存地址。

示例

# input number inputNumber = 5 # printing the memory address of the int variable print('Before updating, memory address = ', id(inputNumber)) # here we are updating an int object by assigning a new value to it. # changing the same input number variable by assigning a new value to it inputNumber = 10 # printing the memory address of the int variable after updating using id() function print('After updating, memory address = ', id(inputNumber))

输出

执行上述程序将生成以下输出

Before updating, memory address =  140509421819936
After updating, memory address =  140509421820096

类似地,**float** 数据类型在更新后也会更改其内存地址值。

tuple

元组也是不可变的,这意味着我们无法向其中追加或更新任何内容。在修改元组中的任何项时,我们会收到错误“元组”对象不支持项赋值。

示例

# input tuple inputTuple = ('hello', 'tutorialspoint', 'python') # printing the original input tuple print("The original input tuple:", inputTuple) # modifying the tuple element at index 2 using indexing inputTuple[2]= 'welcome' # printing input tuple after modifying print("Input tuple after modification:", inputTuple)

输出

The original input tuple: ('hello', 'tutorialspoint', 'python')
Traceback (most recent call last):
File "main.py", line 6, in <module>
inputTuple[2]= 'welcome'
TypeError: 'tuple' object does not support item assignment

我们使用一些随机值创建了一个元组,然后用另一个随机值更改了列表的元素,因为元组是不可变数据类型,所以元素的值不会更改,并且会抛出异常。

字符串

由于字符串是不可变的,因此我们无法向其中追加或更新任何内容。在修改字符串的任何部分时,我们遇到了表明字符串本质上不可变的问题。

示例

# input string inputString = 'Welcome to tutorialspoint python' # changing the string character at index 1 inputString[1] = 'a' print(inputString)

输出

Traceback (most recent call last):
File "main.py", line 4, in <module>
inputString[1] = 'a'
TypeError: 'str' object does not support item assignment

可变与不可变

可变 不可变
对象的状态一旦创建就可以更改 对象的状态一旦创建就不能更改
可变对象不是线程安全的 不可变对象是线程安全的
由于可变对象不是最终的,因此程序员可以在继续使用相同对象的同时不断更改它们。 在创建不可变对象之前,必须将类设为 final。

结论

在本节中,我们学习了可变对象和不可变对象,以及可变对象和不可变对象的示例及其源代码。我们还学习了可变对象和不可变对象之间的区别。

更新于: 2022年9月15日

559 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告