一道问题引出的python中可变数据类型与不可变数据类型

枫铃3年前 (2021-07-10)Python226

一. 问题的提出

我们先来看两个对比

第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化

a = 1
b = a
b += 1

print(a)
print(b)


结果:
2

第二道题,当对象为字典时,最终结果:a = {“name”:“jack”,“age”:27}, b = {“name”:“jack”,“age”:27},b的变化引起了a的变化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
a = {"name": "Jack"}
b = a
b["age"] = 27

print(a)
print(b)


结果:
{"name":"Jack""age":27}
{"name":"Jack""age":27}

那么,为什么上述两道题的结果会有如此大的区别呢?我们就来了解一下可变数据类型和不变数据类型

二. 可变数据类型和不可变数据类型

  • 可变数据类型有:列表list、字典dict
  • 不可变数据类型有:整型int、浮点型float、字符串string和元组tuple

python中有一个id()函数,可用来获取对象的内存地址,我们针对第一题,可以看一下a和b指向的对象的内存地址有什么变化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = 1
>>> b = a
>>> id(a)
>>> id(b)
>>> b += 1
>>> id(b)
>>> id(a)
>>>

我们可以清晰的看到,a = 1, b = a,这两个操作中,变量a和b指向的对象的内存地址是一样的,也就是说a和b其实引用了同一个对象1。那为什么整型是不可变数据类型呢?这里可以理解为a和b的引用地址处的值是不能被改变的,也就是1814284368地址处的值在没被垃圾回收之前一直是1,不能改变,如果把b赋值为2,那么,只能把b的引用地址从1814284368变为1814284400,相当于b += 1这个赋值又创建了一个新的对象2,然后变量a仍然指向对象1,而变量b指向了对象2,变量b的变化并不会引起a的改变,因为它们指向的是不同的对象

我们大概画个演示图:

图一:a = 1, b = a
在这里插入图片描述
图二: b += 1
在这里插入图片描述
我们再来看字典,先用id()看一下内存地址的变化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = {"name": "Jack"}
>>> b = a
>>> id(a)
>>> id(b)
>>> b["age"] = 27
>>> id(a)
>>> id(b)
>>> a
{'age': 27, 'name': 'Jack'}
>>> b
{'age': 27, 'name': 'Jack'}

可以看到,变量a和b同时指向一个字典对象,当给变量b指向的字典添加元素后,b指向的字典的内存地址并不会发生变化,也就是说,对b的操作不会改变a引用的地址值,相当于同样一个地址得到了扩充,由于a和b指向同一个地址,所以b的变化会引起a的变化

图一:a = {“name”: “Jack”}, b = a

在这里插入图片描述
图二:b[“age”] = 27
在这里插入图片描述

相关文章

python爬虫Scrapy框架之增量式爬虫

一 增量式爬虫 什么时候使用增量式爬虫: 增量式爬虫:需求 当我们浏览一些网站会发现,某些网站定时的会在原有的基...

python中浅拷贝和深拷贝分析

python中浅拷贝和深拷贝分析

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变。 不可变:Numbe...

python 的String,集合(List,元组,Dict)

引言 想学爬虫还是 python 专业啊,之前一直在用 java, 现在决定尝尝鲜,使用 python及爬虫框架来...

Python传入参数的几种方法

Python传入参数的几种方法

写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式&...

Python  File(文件) 方法

Python File(文件) 方法

open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数&...

Python代码规范之简明概述

1、编码 如无特殊情况, 文件一律使用 UTF-8 编码如无特殊情况, 文件头部必须加入#-*-coding:utf-8-*-标识 2、代码格式 2.1...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。