Python中变量的定义

请叫我涛哥0-0 2013-10-02 11:51:32
[b]Python中变量是不需要预先定义变量类型。
即使是变量名相同而值不同,那么它是两个变量。

var = 123
print id(var)#id=24667936
var = 456
print id(var)#id=29986072

说明123,和456是存在俩个变量中的。

下面这个代码中id(sum)会有重复呢?
(从23,24开始就两个地址在重复,)
sum = 0
for i in range(101):
sum += i
print i,id(sum)#这里不应该是100不同的地址码?
else:
print sum

---------- PythonRun ----------
0 24667428
1 24667416
2 24667392
3 24667356
4 24667308
5 24667248
6 24667176
7 24667092
8 24666996
9 24666888
10 24666768
11 24666636
12 24668476
13 24668320
14 24668152
15 24667972
16 24667780
17 24667576
18 24669344
19 24669116
20 24668876
21 24668624
22 24670344
23 29985952
24 29985964
25 29985952
26 29985964
27 29985952
28 29985964
29 29985952
30 29985964
31 29985952
32 29985964
33 29985952
34 29985964
35 29985952
36 29985964
37 29985952
38 29985964
39 29985952
40 29985964
41 29985952
42 29985964
43 29985952
44 29985964
45 29985952
46 29985964
47 29985952
48 29985964
49 29985952
50 29985964
51 29985952
52 29985964
53 29985952
54 29985964
55 29985952
56 29985964
57 29985952
58 29985964
59 29985952
60 29985964
61 29985952
62 29985964
63 29985952
64 29985964
65 29985952
66 29985964
67 29985952
68 29985964
69 29985952
70 29985964
71 29985952
72 29985964
73 29985952
74 29985964
75 29985952
76 29985964
77 29985952
78 29985964
79 29985952
80 29985964
81 29985952
82 29985964
83 29985952
84 29985964
85 29985952
86 29985964
87 29985952
88 29985964
89 29985952
90 29985964
91 29985952
92 29985964
93 29985952
94 29985964
95 29985952
96 29985964
97 29985952
98 29985964
99 29985952
100 29985964
5050

输出完成 (耗时 0 秒) - 正常终止
...全文
26462 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
学习了
ylf13 2014-03-23
  • 打赏
  • 举报
回复
range()为了提高效率,只有在访问到那个数的时候才会计算返回值,所以可能会覆盖之前的地址吧
请叫我涛哥0-0 2013-10-17
  • 打赏
  • 举报
回复
把地址用list保存起来,藐视是完整的。

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]:
引用 3 楼 angel_su 的回复:
试试用一个列表记录每个sum,保持着引用就不会被收,id也就不该重复...
jeky_zhang2013 2013-10-07
  • 打赏
  • 举报
回复
讲的很详细,以前看了下python源码解析,很有启发 In [265]: a, b = 1000, 1000; id(a), id(b) ...: Out[265]: (43637240, 43637240) 这个难道与变量定义的作用域有关么?有可能这个是一起定义的,就放在了一个地方
iasky 2013-10-03
  • 打赏
  • 举报
回复
不错,学习了
ChongQingJin28 2013-10-02
  • 打赏
  • 举报
回复
有本书叫python源码剖析,那里可能有答案,就算没有答案,也会给你指明方向。
panghuhu250 2013-10-02
  • 打赏
  • 举报
回复
首先,id取的是值的“id”,而不是变量的“id”。
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)
angel_su 2013-10-02
  • 打赏
  • 举报
回复
试试用一个列表记录每个sum,保持着引用就不会被收,id也就不该重复...
请叫我涛哥0-0 2013-10-02
  • 打赏
  • 举报
回复
引用 1 楼 zhouchongzxc 的回复:
有本书叫python源码剖析,那里可能有答案,就算没有答案,也会给你指明方向。
开始有几个重复,可以认为是Python自己回收了,但后面从23,24重复出现,觉得回收不太可能。

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧