|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sonichuang 于 2018-8-28 23:33 编辑
如下图:为什么直接访问集合的id,地址没有变化,但是用参数引用这个集合时,id又发生了变化呢?
但是如字符串,直接访问的时候没有变化,后面参数引用也不会发生变化。
跟集合同是可变对象的列表,直接访问id每次都会生成新的id, 参数引用也一样。集合有什么不同吗?
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 #先让它做点别的事,再看地址变了。
复制代码
|
|