| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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 #先让它做点别的事,再看地址变了。
 
  复制代码 
 
 
 |   
 
 
 
 |