37,721
社区成员
发帖
与我相关
我的任务
分享
var = 123
print id(var)#id=24667936
var = 456
print id(var)#id=29986072
sum = 0
for i in range(101):
sum += i
print i,id(sum)#这里不应该是100不同的地址码?
else:
print sum
In [16]: l = []
In [17]: s = 0
In [18]: for i in range(101):
....: s+=i
....: l.append(id(s))
....: else:
....: print l
....:
[10417660, 10417648, 10417624, 10417588, 10417540, 10417480, 10417408, 10417324
10417228, 10417120, 10417000, 10416868, 10418708, 10418552, 10418384, 10418204
10418012, 10417808, 10419576, 10419348, 10419108, 10418856, 11346760, 13355304
13365524, 13420228, 13406904, 13415448, 14084228, 13422508, 13359908, 13454660
13408096, 13354488, 13408000, 15027348, 13419592, 13442564, 13419688, 13419544
13438196, 13358148, 13438280, 13453504, 13453516, 13414580, 13437256, 13361996
13362080, 13363956, 13453600, 13369432, 13356992, 13357064, 13363944, 13403928
13414568, 13414532, 13414640, 14184648, 13422048, 14184636, 15024264, 14184612
13425372, 13416712, 13425252, 13363392, 13363308, 13340548, 14085576, 13340524
13368044, 13406436, 13340176, 14085204, 13440924, 13426084, 13426096, 14085104
13440876, 14085116, 14085336, 15025588, 13414508, 15025696, 13363596, 13363608
13420000, 13403312, 13442432, 13442396, 13435016, 13434772, 13434992, 13435124
13356764, 13432172, 13356740, 13419988, 13416652]
In [19]:
In [198]: b = {}
In [199]: a = b
In [200]: id(b)
Out[200]: 46466064
In [201]: id(a)
Out[201]: 46466064
第二,值的id即它的内存地址,下面是id的文档:
In [228]: id?
Type: builtin_function_or_method
String Form:<built-in function id>
Namespace: Python builtin
Docstring:
id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
你观察到的现象换成“值”的内存地址来说就是:有些值一定会有不同的内存地址,有些值的内存地址会重复。
一般情况下,当你给一个变量赋一个整数值时,python会新造一个值给它,下面的例子中,两个1000的地址是不一样的。
In [229]: a = 1000
In [230]: id(a)
Out[230]: 43636856
In [231]: a = 1000
In [232]: id(a)
Out[232]: 44516288
但对于常用的小整数(具体到现在的cpython来说是-5到256),python会重复利用它们。例子:
In [253]: a = 7; b = 7 ; id(a), id(b)
...:
Out[253]: (24517656, 24517656)
In [254]: a = 256; b = 256; id(a), id(b)
...:
Out[254]: (24523632, 24523632)
In [255]: a = 257; b = 257; id(a), id(b)
...:
Out[255]: (43637000, 43637168)
相关文档(http://docs.python.org/3.3/c-api/long.html):
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. :-)
1 + ... + 23 = 276是第一个超过256的值,在这之前,python使用的公用的小整数,这之后,python开始构造新的object,id会重复大概是内存回收的结果。
把你的例子运行两遍,可以看到,23之前的输出一样,23以后(可能)不一样。
In [261]: s = 0
In [262]: for i in range(101):
...: s += i
...: print i, id(s)
...: else:
...: print s
0 24517824
1 24517800
2 24517752
3 24517680
4 24517584
5 24517464
6 24517320
7 24517152
8 24518952
9 24518736
10 24518496
11 24518232
12 24519936
13 24519624
14 24519288
15 24520920
16 24520536
17 24520128
18 24521688
19 24521232
20 24522744
21 24522240
22 24523704
23 43637288
24 43636976
25 43637288
26 43636976
27 43637288
# 删去重复的输出
5050
In [263]: s = 0
In [264]: for i in range(101):
...: s += i
...: print i, id(s)
...: else:
...: print s
0 24517824
1 24517800
2 24517752
3 24517680
4 24517584
5 24517464
6 24517320
7 24517152
8 24518952
9 24518736
10 24518496
11 24518232
12 24519936
13 24519624
14 24519288
15 24520920
16 24520536
17 24520128
18 24521688
19 24521232
20 24522744
21 24522240
22 24523704
23 44516504
24 44515952
25 44516504
26 44515952
27 44516504
# 删去重复的输出
5050
In [265]:
另注:上面的例子换一种写法,python不知道怎么就知道两个1000是一样的?奇怪!
In [265]: a, b = 1000, 1000; id(a), id(b)
...:
Out[265]: (43637240, 43637240)