page contents

可变与不可变数据类型

从上面的代码和运行结果可以看出,进行两次list1 = [0, 1, 2]操作,两次list1引用的地址值是不同的,也就是说其实创建了两个不同的对象(两个不同的地址值),具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同

可变、不可变

可变数据类型

包括:列表、字典、集合

我们通过对列表的例子(其他数据类型与此类似)来演示一下什么叫做可变数据类型,先观察下面的代码及其结果

list1 = [0, 1, 2]
print(id(list1))  # 查看当前变量的地址值

list1 = [0, 1, 2]
print(id(list1))

分析:从上面的代码和运行结果可以看出,进行两次list1 = [0, 1, 2]操作,两次list1引用的地址值是不同的,也就是说其实创建了两个不同的对象(两个不同的地址值),具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同

再来看一下下面的代码及其结果

list1 = [0, 1, 2]
print(id(list1))  # 查看当前变量的地址值

list1.append(3)  # 增加元素
print(id(list1))

del list1[1]  # 删除元素
print(id(list1))

list1 += [4, 5]  # 两个列表连接
print(id(list1))

分析:从上面的代码和运行结果可以看出,我们对列表进行添加操作、删除操作、列表连接,发现这三个操作使得list1引用的对象值变成了上面的最终结果,但是a引用的地址依旧是2973221999112,也就是说对list1进行的操作不会改变list1引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值(可以想象成一个房间里的人变化了,房子面积可能得到了扩大,但是仍然是这个房子),所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。下图对这一过程进行了图示,可以很清晰地看到这一过程:20151116144357246

不可变数据类型

包括:整型、浮点型、字符串、元组

我们通过对整型数据的例子(其他数据类型与此类似)来演示一下什么叫做不可变数据类型,先观察下面的代码及其结果

# 变量的值为 1 时
a = 1
b = 1
print(id(a))  # 查看a的地址值
print(id(b))

# 变量的值为 2 时
a = 2
b = 2
print(id(a))
print(id(b))

z = a
print(id(z))

分析:上面这段程序都是对不可变数据类型中的int类型的操作。我们先来看a = 1和b = 1两个操作的结果,从上面的输出可以看到a和b在此时的地址值是一样的,也就是说a和b其实是引用了同一个对象,即1,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。当我们进行a = 2赋值时,发现a的地址值变了,虽然还是a这个引用,但是其地址值却变化了,后面的b = 2以及z = a,使得a、b和c都引用了同一个对象,即2,所以地址值都是一样的。当a和b都被赋值2后,1这个对象已经没有引用指向它了,所以1这个对象占用的内存,即140715364023360地址要被“垃圾回收”,即1这个对象在内存中已经不存在了。所以不可变数据类型的意思就是说对一个变量进行操作时,值的变化会引起重新建立对象,即地址是会改变的,旧地址的对象如果没有引用指向它,会被回收。下图对这一过程进行了图示,可以很清晰地看到这一过程:

20151116144347389

总结:不可变数据类型的值一旦被修改后(新对象还未分配内存空间)会创建一个内存空间并且生成新的地址值,可变数据类型的值会在原内存空间中被修改

  • 发表于 2021-05-22 20:59
  • 阅读 ( 486 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Cara
Cara

36 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章