前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】可变数据类型 & 不可变数据类型 || hash

【Python】可变数据类型 & 不可变数据类型 || hash

作者头像
謓泽
发布2024-03-07 09:10:55
890
发布2024-03-07 09:10:55
举报
文章被收录于专栏:【C】系列【C】系列
  • 🚩 WRITE IN FRONT 🚩
  • 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎
  • 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博主、华为云享专家、阿里云专家博主、掘金优秀创作者、全网粉丝量7w+、个人社区人数累计4w+、全网访问量100w+ 🏅
  • 🆔 本文章内容由 謓泽 原创 如需相关转载请提前告知博主 ⚠
  • 📑 创作时间:2022 年 5 月 2 日 📅
  • 📝 个人主页:謓泽的博客 📃
  • 📣 专栏系列:【Python】系列_謓泽的博客📃
  • 🙌 Gitee:謓泽 (wsxsx) - Gitee.com ⭐️
  • 🎁 点赞👍+ 收藏⭐️+ 留言📝​
  • ✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 📩

可变数据类型 🐟 不可变数据类型

在Python当中的列表(List)字典(Dict) 是属于可变数据类型。

在Python当中的整形(int)浮点型(float)字符串型(string)元组(Tuple) 是属于不可变数据类型。

以上就是可变类型与不可变数据类型这个是要掌握的。

不可变类型:在内存当中一旦进行了定义并且指定了内容之后,便不再允许进行修改了。

不可变类型: 在内存当中分配了空间的话,我们是可以通过变量名调用方法来去修改它的列表或者是字典当中的内容的。通过方法进行调用可以做到通过方法调用(appedn、pop...)列表字典的内容发生变化,但是它们的内存地址是依旧不会发生变化的。示例代码如下↓

代码语言:javascript
复制
listA = ['Python',123456,3.14,'你好','True']
print("追加之前:",listA)
print("前地址:",id(listA))
listA.append(666)
print("追加之后:",listA)
print("后地址:",id(listA))

运行结果🖊

追加之前: ['Python', 123456, 3.14, '你好', 'True'] 前地址: 1642029321408 追加之后: ['Python', 123456, 3.14, '你好', 'True', 666] 后地址: 1642029321408

上述红色颜色字体发现它们的地址都是一样的,从中也可以说明上述的证实了。

注→id()用来查看变量类型当中的地址的。

那么上述是不可变类型我们来观察下可变类型来看看结果会是怎么样的吧→如下代码所示↓

代码语言:javascript
复制
a = 20
print(id(a))
a = 24
print(id(a))

运行结果🖊

2689600613264 2689600613392

上述红色标注粗体字可以证实这个是不可变类型,改变之后就会改变了它们内存的地址了。

id()

辨别变量是可变数据类型还是不可变数据类型,我们只需要使用 id() 函数就可以查看变量在内存地址当中的变换即可。

如果 id(变量) 的值不变,即说明该变量是不可变数据类型。

如果 id(变量) 的值变化,即说明该变量是可变数据类型。

不可变数据类型分析

不可变数据类型分析,使用 id() 函数来查看变量的内存地址。

输出 int_a1 变量的内存地址,输出 int_b1 变量的内存地址。

示例代码如下所示 👇

代码语言:javascript
复制
int_a1 = 1
int_b1 = 1
print(id(int_a1))
print(id(int_b1))

运行结果如下 👇

94121337434592 94121337434592

从中可以发现数据类型是不可变的!

用图表示上述代码,如下所示 👇

那么如果我们修改上述代码当中变量int_a1当中的值此刻内存地址会发生什么样的变换呢?到底会发生变换还是不会发生变换。

示例代码如下所示 👇

代码语言:javascript
复制
int_a1 = 2
int_b1 = 1
print(id(int_a1))
print(id(int_b1))

运行结果如下 👇

94216515551744 94216515551712

从这里可以发现改变int_a1当中的值,没有修改b1当中的值数据类型都是(int)从中会发生内存地址的改变。

可变数据类型分析

可变数据类型分析,以列表为示例。

输出 a 变量的内存地址,输出 b 变量的内存地址。

示例代码如下所示 👇

代码语言:javascript
复制
a = [1,2,3,4]
b = [1,2,3,4]
print(id(a))
print(id(b))

运行结果如下 👇

140510981916096 140510981930432

在上述代码示例当中,分别定义了列表 a = [1,2,3,4] 和 b = [1,2,3,4]。通过下列图中所示的内存分布图来了解变量 a 和 b 是怎么分配内存的。

那么让我们来思考下既然列表是可变数据类型,那么在定义两个列表指向同一内存空间时候,如果修改其中一个列表元素,另外一个列表中元素是否被修改。

定义列表a,然后赋值给b,查看内存地址

示例代码如下所示 👇

代码语言:javascript
复制
a = [1,2,3,4]
b = a
print(id(a),id(b))

运行结果如下 👇

140533352129984 140533352129984

通过赋值可以看出,变量 a 和 b 都指向了统一空间没有修改。

修改列表a,查看列表b 是否改变

示例代码如下所示 👇

代码语言:javascript
复制
a = [1,2,3,4]
b = [1,2,3]
print(id(a))
print(id(b))

运行结果如下 👇

139793869161920 139793869176256

提示:因为a、b指向的都是同一列表,为可变数据类型。因此对 a、b任意一个列表进行修改都会影响到另外一个列表的值。

哈希(hash)

Python 当中内置有一个名字叫做 hash(o) 的函数。

  • 接收一个不可变类型的数据作为它的参数,注:整形(int)浮点型(float)字符串型(string)元组(Tuple) 是属于不可变数据类型。
  • 接收一个不可变的数据类型作为参数。『python的特点』
  • 返回 结果是一个整数(int)

哈希是一种算法,起作用就是提取数据的特征码『指纹』

  • 相同的内容 得到 相同的结果。
  • 不同的内容 得到 不同的结果。
  • 指纹的意思:如果是同一个人指纹就是相同的,如果是不同的人指纹就是不同的。

示例代码如下↓

代码语言:javascript
复制
# 不可变数据类型
print(hash(1))
# 可变数据类型
print(hash([123]))

运行结果如下↓

1

TypeError: unhashable type: 'list'

相信当你看到这个也就对python当中的哈希也就有所了解了。

拓展key

键值的key必须是不可变数据类型。

键值对的value可以是任意数据类型。这个要注意下对于hash

代码语言:javascript
复制
dict = {hash([123]):123}
print(dict)

运行结果🖊

dict = {hash([123]):123} TypeError: unhashable type: 'list'

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可变数据类型 🐟 不可变数据类型
    • 拓展key
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档