鱼C论坛

 找回密码
 立即注册
查看: 1533|回复: 2

[技术交流] Python中的可变对象和不可变对象

[复制链接]
发表于 2017-10-3 16:57:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python中的可变对象和不可变对象


今天在翻译 Requests 文档 的时候发现这两个概念性词汇,怕你们看了懵逼,所以这里大概说明一下。

Python 在堆里面分配的对象分为两类:可变对象和不可变对象。

就我们熟知的类型来说,dict 和 list 属于可变对象,int、float、str 和 tuple 则属于可变对象。

那么这个“可变”和“不可变”指的是什么东西?



可变对象

可变对象是指那些允许其引用的内容发生变化的对象,举个栗子:

  1. >>> list1 = [1, 2, 3, 4, 5]
  2. >>> list2 = list1
  3. >>> print("list1's id is " + str(id(list1)))
  4. list1's id is 2473635711816
  5. >>> print("list2's id is " + str(id(list2)))
  6. list2's id is 2473635711816
复制代码

上面例子中,list1 和 list2 共同引用 id 为 2473635711816 的内容,如果此时我们对 list1 引用的内容进行修改:

  1. >>> list1.append(6)
复制代码

可以发现,list2 引用的内容也自动被改变了:

  1. >>> list2
  2. [1, 2, 3, 4, 5, 6]
复制代码

此时,list1 和 list2 仍然是引用同一块数据:
  1. >>> print("list1's id is " + str(id(list1)))
  2. list1's id is 2473635711816
  3. >>> print("list2's id is " + str(id(list2)))
  4. list2's id is 2473635711816
复制代码

这就是允许其引用的内容发生变化的对象。


不可变对象

相反,不可变对象是指那些不允许其引用的内容发生变化的对象,举个栗子:

  1. >>> i = 520
  2. >>> j = i
  3. >>> print("i's id is " + str(id(i)))
  4. i's id is 2473635778672
  5. >>> print("j's id is " + str(id(j)))
  6. j's id is 2473635778672
  7. >>> i is j
  8. True
复制代码

上面例子中,i 和 j 共同引用 id 为 2473635778672 的内容,如果此时我们对 i 引用的内容进行修改:

  1. >>> i = 88
复制代码

可以发现,j 引用的内容并不会跟着改变:

  1. >>> j
  2. 520
复制代码

此时,i 和 j 已经不再共享同一块数据了:

  1. >>> print("i's id is " + str(id(i)))
  2. i's id is 1527894416
  3. >>> print("j's id is " + str(id(j)))
  4. j's id is 2473635778672
复制代码

这是因为 int 是不可变对象,所以当对 i 进行修改时,发现同一个位置还有其他变量的引用,于是将 i 拷贝到一个新的位置再进行修改。

评分

参与人数 2荣誉 +6 鱼币 +6 贡献 +5 收起 理由
purplenight + 1 + 1 热爱鱼C^_^
SixPy + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-3 18:47:26 | 显示全部楼层
沙发~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-6 05:00:48 | 显示全部楼层
第三行漏了个“不”字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表