sonichuang 发表于 2018-8-28 23:27:03

Python中集合的id地址问题

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

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


claws0n 发表于 2018-8-28 23:56:01

只有首地址
虽然所存储的内容一样,但 a, b, c 是不同的集合,所以地址不一样
变量是容器的话,就会不一样了
普通变量的话就有区别了,浅拷贝于深拷贝。这里的 a = 'abc', b = 'abc', ... 是浅拷贝,指向同一笔数据

sonichuang 发表于 2018-8-29 00:24:27

claws0n 发表于 2018-8-28 23:56
只有首地址
虽然所存储的内容一样,但 a, b, c 是不同的集合,所以地址不一样
变量是容器的话,就会不一 ...

为什么直接查询列表会出现不用的地址,而集合则只有同一个地址呢?

claws0n 发表于 2018-8-29 01:17:41

sonichuang 发表于 2018-8-29 00:24
为什么直接查询列表会出现不用的地址,而集合则只有同一个地址呢?

集合有唯一性,既然元素是一样的,就当作同一个集合

冬雪雪冬 发表于 2018-8-29 10:20:05

python的赋值与其他语言不同,采用标签法,即先在内存放入变量的值,然后将一个变量名作为标签帖在其上面。
以整数为例,一些简单的整数,放在固定位置,这样无论赋值给几个变量名都是同一地址。
>>> a = 3
>>> b = 3
>>> c = 3
>>> id(a), id(b), id(c)
(256194848, 256194848, 256194848)

而其他的整数,即使数值相同在给多个变量赋值时,仍可能使用不同的地址。从某种意义上看,就是浪费了空间。
>>> a = 123456
>>> b = 123456
>>> c = 123456
>>> id(a), id(b), id(c)
(46587168, 46587056, 46587008)
再说说你的例子,id({1, 2,'a'})是在内存申请空间放置了一个变量,但没有贴标签,即没有赋值给一个变量名,一会儿就会释放掉,再id({1, 2,'a'})时就会有新的地址。而连续id({1, 2,'a'})则还没等到释放掉又查看所有地址是相同的。、
>>> id({1, 2,'a'})
46465912
>>> id({1, 2,'a'})
46465912 #地址相同
>>> a = {1, 2,'a'}
>>> b = {1, 2,'a'}
>>> c = {1, 2,'a'}
>>> id(a), id(b), id(c)
(46465912, 46466032, 46466392)
>>> id({1, 2,'a'})
46466872 #先让它做点别的事,再看地址变了。
页: [1]
查看完整版本: Python中集合的id地址问题