Python数据类型可变与不可变深入分析
在 Python 中,每一个对象都有其类型,一个变量的数据类型即为所存储对象的类型。Python 中的数据类型可以分为可变和不可变两种类型,本篇文章将深入分析这两种数据类型的区别。
可变数据类型
可变数据类型是指数据类型中的元素可被修改。Python 中的可变数据类型有 list
、dict
、set
、bytearray
等。
举例来说,我们先声明一个列表 lst
:
lst = [1, 2, 3, 4, 5]
列表中的元素可以通过索引进行修改:
lst[0] = 6
print(lst) #[6, 2, 3, 4, 5]
再看一个字典 dict
:
dict_1 = {'name' : 'Alice', 'age' : 22}
字典中的元素可通过键进行修改:
dict_1['name'] = 'Bob'
print(dict_1) #{'name': 'Bob', 'age': 22}
不可变数据类型
不可变数据类型是指数据类型中的元素不可被修改。Python 中的不可变数据类型有 int
、float
、str
、tuple
、bool
、frozenset
等。
我们先声明一个字符串 str1
:
str1 = 'hello'
字符串中的元素不可被修改:
str1[0] = 'H' # TypeError: 'str' object does not support item assignment
再看一个元组 tuple
:
tuple_1 = (1, 2, 3)
元组中的元素也不可被修改:
tuple_1[0] = 4 # TypeError: 'tuple' object does not support item assignment
可变数据类型和不可变数据类型的区别
从上面的例子中,我们可以看出主要区别在于在进行修改后,原对象内存地址的变化。
不可变类型,在修改值的时候会开辟一个新的空间,来存放新的值,不会对原来的空间产生影响,返回的是一个新的地址。下面是一个例子,我们先将字符串str1
变量的内存地址打印出来:
str1 = 'hello'
print(id(str1)) #140460445576496
然后进行修改:
str1 += ', world'
print(str1) #hello, world
print(id(str1)) #140460445577200
我们再次打印出 str1
的内存地址,可以发现与之前相差了704。因为在上一个位置的空间中已经没有 str1, world
,该字符串已经被分配了一个新空间。
可变类型,修改一个元素,它的内存地址不会发生变化。下面是一个例子:
lst_2 = [1, 2, [3, 4], 5]
lst_2[2][0] = 7
print(lst_2) #[1, 2, [7, 4], 5]
我们看到,在修改列表中嵌套列表的时候,该嵌套列表在原址修改。这是因为开辟新的空间需要更多的时间,我们希望能够在一个原址中完成就可以了。
综上所述,我们了解了 Python 中的可变和不可变数据类型的区别,掌握这种差异有助于编写出更高效的代码
示例1
这是一个修改列表的例子:
lst = [1, 2, 3, 4, 5]
id_org = id(lst)
lst[0] = 6
id_new = id(lst)
print(id_org, id_new)
运行结果如下:
4355091328 4355091328
我们可以看出在列表的某一元素进行修改,其原地址是不变的。
示例2
这是一个修改字符串的例子:
str1 = 'hello'
id_org = id(str1)
str1 += ', world'
id_new = id(str1)
print(id_org, id_new)
运行结果如下:
4566203248 4566203440
我们可以看到在字符串的某一元素进行修改,其原地址是变化的,是开辟了新的内存空间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python数据类型可变与不可变深入分析 - Python技术站