前言
在python当中,我们经常处理的数据主要分为两类:可变数据类型(列表、字典)和不可变数据类型(字符串、元组)。而这两种数据类型在处理和参数传递过程当中,有着一些常常被忽略的特性。
实例理解
1.1 不可变数据类型
先附上一段代码,大家仔细想想最后的输出结果是多少?
a_str="hello python"
b_str=a_str # 将a_str的值赋给b_str
print(b_str) # 输出b_str
a_str="hello DL_ZovX" # 给a_str赋新值
print("a_str:\t",a_str) #输出
print("b_str:\t",b_str) # 输出
想一下,最后的a_str和b_str分别是多少?小伙伴们可以自己动手敲一下代码,看看是否和自己大答案一致。
最终的答案如下:
------------------------------------------------------------
hello python
a_str: hello DL_ZovX
b_str: hello python
我们还可以查看一下这两个变量的id地址:
print("a_str的id:\t",id(a_str))
print("b_str的id:\t",id(b_str))
--------------------------------------------------------------
a_str的id: 1677338433968
b_str的id: 1677338433840
? ? ? ?运行显示,两个变量的内存地址已经不同,这是因为字符串类型的变量是不可变数据类型,所以当它进行第二次赋值时,将会创建一个新的地址空间,并让a_str这个变量指向新的地址空间。
下面是一张思维导图,方便理解。
?b_str=a_str?
这个语句其实就是创建了一个新的变量名b_str,并把它指向a_str所指向的地址空间。
1.2 可变数据类型
上面的例子是不可变数据类型,如何是可变数据类型,结果将是怎么样呢?
先上一段代码:
list1=[1,2,3]
list2=list1 # 将list1的值赋给list2
print("改变前")
print(list2) # 输出
print("---------------------------------")
list1[0]=2 # 将list1的第一个元素重新赋值为2
print("改变后")
print("list1:\t",list1) # 输出
print("list2:\t",list2) # 输出
感兴趣的小伙伴,还可以继续敲一下代码,看一下运行结果是否和自己想象的一样。
我这里就直接公布答案了!
改变前
[1, 2, 3]
---------------------------------
改变后
list1: [2, 2, 3]
list2: [2, 2, 3]
? ? ? ?这里我们发现,当我们改变 list1 的第一个元素的值后,list2的值也跟着变了。这是因为列表是可变数据类型,当我们去修改其中某一个元素的值时,并不会创建一个新的列表(内存地址),可以理解成只是吧原先内存地址存的数据修改了,这就是可变数据类型和不可变数据类型的显著区别。
我们可以查看一下修改前后,列表的id值。
list1=[1,2,3]
list2=list1 # 将list1的值赋给list2
print("改变前")
print(list2) # 输出
print("list1的id:\t",id(list1))
print("list2的id:\t",id(list2))
print("---------------------------------")
list1[0]=2 # 将list1的第一个元素重新赋值为2
print("改变后")
print("list1:\t",list1) # 输出
print("list2:\t",list2) # 输出
print("list1的id:\t",id(list1))
print("list2的id:\t",id(list2))
结果如下:
改变前
[1, 2, 3]
list1的id: 2656538548096
list2的id: 2656538548096
---------------------------------
改变后
list1: [2, 2, 3]
list2: [2, 2, 3]
list1的id: 2656538548096
list2的id: 2656538548096
? ? 我们发现 list1 和 list2 的id值均为 2656538548096,所以并没有创建新的内存地址,list1和list2两个变量名还是指向同一块内存地址(理解)。
?
总结
? ? ? ? 在我们的日常使用中,应当要多注意可变数据类型和不可变数据类型的区别,以防出现一些不易察觉的BUG。
? ? ? ?后续还会更新一些自己在学习过程中,觉得重要的一些知识点!!!
? ? ? 如何觉得这篇分享帮助了你,就动动小手来波三连吧!!!
|