鱼C论坛

 找回密码
 立即注册
查看: 2827|回复: 4

[已解决]Python中集合的id地址问题

[复制链接]
发表于 2018-8-28 23:27:03 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sonichuang 于 2018-8-28 23:33 编辑

如下图:为什么直接访问集合的id,地址没有变化,但是用参数引用这个集合时,id又发生了变化呢?
但是如字符串,直接访问的时候没有变化,后面参数引用也不会发生变化。
跟集合同是可变对象的列表,直接访问id每次都会生成新的id, 参数引用也一样。集合有什么不同吗?
9.png 7.png

最佳答案
2018-8-29 10:20:05
python的赋值与其他语言不同,采用标签法,即先在内存放入变量的值,然后将一个变量名作为标签帖在其上面。
以整数为例,一些简单的整数,放在固定位置,这样无论赋值给几个变量名都是同一地址。
  1. >>> a = 3
  2. >>> b = 3
  3. >>> c = 3
  4. >>> id(a), id(b), id(c)
  5. (256194848, 256194848, 256194848)
复制代码


而其他的整数,即使数值相同在给多个变量赋值时,仍可能使用不同的地址。从某种意义上看,就是浪费了空间。
  1. >>> a = 123456
  2. >>> b = 123456
  3. >>> c = 123456
  4. >>> id(a), id(b), id(c)
  5. (46587168, 46587056, 46587008)
复制代码

再说说你的例子,id({1, 2,'a'})是在内存申请空间放置了一个变量,但没有贴标签,即没有赋值给一个变量名,一会儿就会释放掉,再id({1, 2,'a'})时就会有新的地址。而连续id({1, 2,'a'})则还没等到释放掉又查看所有地址是相同的。、
  1. >>> id({1, 2,'a'})
  2. 46465912
  3. >>> id({1, 2,'a'})
  4. 46465912 #地址相同
  5. >>> a = {1, 2,'a'}
  6. >>> b = {1, 2,'a'}
  7. >>> c = {1, 2,'a'}
  8. >>> id(a), id(b), id(c)
  9. (46465912, 46466032, 46466392)
  10. >>> id({1, 2,'a'})
  11. 46466872 #先让它做点别的事,再看地址变了。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-8-28 23:56:01 | 显示全部楼层
只有首地址
虽然所存储的内容一样,但 a, b, c 是不同的集合,所以地址不一样
变量是容器的话,就会不一样了
普通变量的话就有区别了,浅拷贝于深拷贝。这里的 a = 'abc', b = 'abc', ... 是浅拷贝,指向同一笔数据

评分

参与人数 1荣誉 +3 鱼币 +2 贡献 +1 收起 理由
sonichuang + 3 + 2 + 1 感谢回复

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-29 00:24:27 From FishC Mobile | 显示全部楼层
claws0n 发表于 2018-8-28 23:56
只有首地址
虽然所存储的内容一样,但 a, b, c 是不同的集合,所以地址不一样
变量是容器的话,就会不一 ...

为什么直接查询列表会出现不用的地址,而集合则只有同一个地址呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-29 01:17:41 | 显示全部楼层
sonichuang 发表于 2018-8-29 00:24
为什么直接查询列表会出现不用的地址,而集合则只有同一个地址呢?

集合有唯一性,既然元素是一样的,就当作同一个集合
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-29 10:20:05 | 显示全部楼层    本楼为最佳答案   
python的赋值与其他语言不同,采用标签法,即先在内存放入变量的值,然后将一个变量名作为标签帖在其上面。
以整数为例,一些简单的整数,放在固定位置,这样无论赋值给几个变量名都是同一地址。
  1. >>> a = 3
  2. >>> b = 3
  3. >>> c = 3
  4. >>> id(a), id(b), id(c)
  5. (256194848, 256194848, 256194848)
复制代码


而其他的整数,即使数值相同在给多个变量赋值时,仍可能使用不同的地址。从某种意义上看,就是浪费了空间。
  1. >>> a = 123456
  2. >>> b = 123456
  3. >>> c = 123456
  4. >>> id(a), id(b), id(c)
  5. (46587168, 46587056, 46587008)
复制代码

再说说你的例子,id({1, 2,'a'})是在内存申请空间放置了一个变量,但没有贴标签,即没有赋值给一个变量名,一会儿就会释放掉,再id({1, 2,'a'})时就会有新的地址。而连续id({1, 2,'a'})则还没等到释放掉又查看所有地址是相同的。、
  1. >>> id({1, 2,'a'})
  2. 46465912
  3. >>> id({1, 2,'a'})
  4. 46465912 #地址相同
  5. >>> a = {1, 2,'a'}
  6. >>> b = {1, 2,'a'}
  7. >>> c = {1, 2,'a'}
  8. >>> id(a), id(b), id(c)
  9. (46465912, 46466032, 46466392)
  10. >>> id({1, 2,'a'})
  11. 46466872 #先让它做点别的事,再看地址变了。
复制代码

评分

参与人数 1荣誉 +5 鱼币 +4 贡献 +3 收起 理由
sonichuang + 5 + 4 + 3 感谢回复

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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