Python中可变数据类型和不可变数据类型解析

什么是不可变数据类型?

不可变数据类型就是变量对应的值是不会改变的,如果改变变量对应的值就会重新开辟一个内存空间再将该变量指向新地址。
不可变类型:

  • 数字(int,float)
  • 字符串(str)
  • 元组(tuple)

性质一:

a=1
b=1
c=a+0
print(a is b)
print(a is c)

is是对两个变量的id进行比较,相同返回True,不同则返回False。
上述代码的结果是打印了两个True
在除了tuple的不可变变量中,只要两个变量的数据类型相同并且值也相等,那么这两个变量的地址也相同
元组(tuple)不符合这一性质

a=(1,2,3)
b=(1,2,3)
print(a is b)

结果返回False
这就是tuple相对于其它不可变变量的特殊性
这个性质的优点在于减少了重复的值对内存空间的占用

性质二:
来看下面的代码:

i = 5
j = i
j += 1
print(i)
print(j)

这个过程中发生了什么呢?
Python中可变数据类型和不可变数据类型解析_第1张图片
由上图我们可以发现不可变变量在“改变”时,原来的对象内容和内存并没有发生变化
再来看一下字符串:

a="abc"
print(a.replace("a","A"))
print(a)

a执行replace 后把里面的“a”换成了“A“相当于创建的新的地址存放”Abc“ ,但是并没有再让a指向这块新的地址所以a并没有变化,通过这一性质我们可以推出:对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

什么是可变数据类型?

变量对应的值可以改变,改变时对象在内存地址中的值原地改变(即还是原来那个内存地址)

可变对象不满足不可变对象的性质一而性质二刚好和不可变对象相反
来看一下可变类型的执行过程和内存分析:

names = ['刘备','关羽','张飞']
usernames = names
names.append('赵云')
print(names)
print(usernames)

Python中可变数据类型和不可变数据类型解析_第2张图片
注意:tuple是一个特殊的不可变类型,因为它其中的元素可以是可变类型。

你可能感兴趣的:(python基础)