Python 中哪些数据类型是不可变的?
在本文中,我们将解释 Python 中的不可变数据类型。
Python 将一切视为对象。实例化对象时会为其分配一个唯一的 ID。我们无法修改对象的类型,但可以更改其值。例如,如果我们将变量 a 设置为列表,则无法将其更改为元组/字典,但可以修改该列表中的条目。
在 Python 中,有两种对象。一方面,有些对象可以改变其内部状态(对象内部的数据/内容),即可以使用预定义的函数或方法进行更改,另一方面,有些对象无法改变其内部状态(对象内部的数据/内容)。
在 Python 中,有两种类型的对象:
可变对象
不可变对象。
总结一下区别,可变对象可以改变其状态或内容,但不可变对象不能。
不可变数据类型
不可变数据类型是在创建后不能修改或改变的对象(例如,通过添加新元素、删除元素或替换元素)。 Python 的不可变数据类型包括:
Int
Float
Tuple
Complex
String
Stringfrozen set [注意:集合的不可变版本]
Bytes
当您对不可变对象进行更改时,初始化期间存储它们的内存会更新。
Int
在计算机编程中,整数是可以为正数、负数或0(...、-1、0、1、...)的整数。整数也称为int。
与其他编程语言一样,四位数或以上的数字不应使用逗号,因此在代码中将 1,000 写成 1000。
int − 有符号整数
long − 用于表示更高值的长整数
示例
以简单的方式打印整数:
print(10) print(-5) # performing math operations with integers sum_int = 20+30 print(sum_int)
输出
执行时,上述程序将生成以下输出 –
10 -5 50
在 Python 应用程序中,整数 有多种使用方式,随着您对该语言的了解越来越多,您将有大量机会使用整数并了解有关此数据类型的更多信息。
由于 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 the id() function print('After updating, memory address = ', id(inputNumber))
输出
执行时,上述程序将生成以下输出 –
Before updating, memory address = 140103023683616 After updating, memory address = 140103023683776
浮点数
浮点数据类型用于表示带小数点的值。
浮点类表示此值。它是以浮点形式表示的实数。使用小数点来指定它。为了表达科学计数法,可以附加字符e或E后跟正数或负数。
同样,浮点数数据类型在更新后也会更改其内存地址值。
示例
# printing the type of input numbers number_1 = 4.5 print("Type of 4.5:", type(number_1)) number_2 = -0.05 print("Type of -0.05:", type(number_2)) number_3 = 3.04e20 print("number_3: ", number_3) print("Type of 3.04e20:", type(number_3))
输出
执行时,上述程序将生成以下输出 –
Type of 4.5: <class 'float'> Type of -0.05: <class 'float'> number_3: 3.04e+20 Type of 3.04e20: <class 'float'>
尾随小数点用于确保变量是浮点数而不是整数,即使它是整数。请注意小数点跟在整数后面时的区别 -
示例
# printing the type of input numbers number_1 = 10 print("Type of 10:", type(number_1)) number_2 = 8. print("Type of 8. :", type(number_2))
输出
执行时,上述程序将生成以下输出 –
Type of 10: <class 'int'> Type of 8. : <class 'float'>
元组
元组同样是不可变的,这意味着我们不能在其中添加或更新任何内容。在修改元组中的任何项时,我们会收到错误"元组"对象不支持项分配。
示例
# 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
我们取一个包含一些随机值的元组,然后用另一个随机值更改列表的元素,因为元组是不可变的数据类型,元素的值不会改变,并且会引发异常。
复数
复数表示为实部+虚部<j>。
示例
inputNumber = 1+2j print(type(inputNumber))
输出
<class 'complex'>
字符串
由于字符串不可变,我们无法在其中添加或更新任何内容。在修改字符串的任何部分时,我们遇到了问题,表明字符串本质上是不可变的。
示例
# 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
Frozenset
Frozenset 和 Set 之间的唯一区别在于它是不可变的。这意味着您在创建集合后无法对其进行更改。
示例
frozen_set = frozenset(("hello", "tutoraialspoint", "python")) # adding new item to frozen_set # we cannot modify it as the frozenset is immutable frozen_set.add("codes")
输出
Traceback (most recent call last): File "main.py", line 4, in <module> frozen_set.add("codes") AttributeError: 'frozenset' object has no attribute 'add'
结论
在本文中,我们了解了不可变的 Python 数据类型。我们还通过示例演示了它们是多么的不可变。