Python中变量的定义解决方法

Python中变量的定义
[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 秒) - 正常终止
Python 变量 地址

------解决方案--------------------
有本书叫python源码剖析,那里可能有答案,就算没有答案,也会给你指明方向。
------解决方案--------------------
试试用一个列表记录每个sum,保持着引用就不会被收,id也就不该重复...
------解决方案--------------------
首先,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)