首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

Python中变量的定义解决方法

2013-10-18 
Python中变量的定义[b]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)



相关文档(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)

热点排行