这两天阅读github上一些项目源码时,发现运算符重载部分不够熟悉,于是又翻了一遍《learning python》。
这是第三遍阅读,第一次是初学python时,第二次是为了给学习django清除障碍。这本书真是难得的佳作,极其清晰明了的教学风格,读来就像小说般流畅,每次重读总有收获。
既然开始写博客了,就好好做好读书笔记吧,方便自己日后的查阅,也方便他人。
在python中,变量名的赋值场所极其重要,这完全决定了变量名所在的作用域或对象。
直接上代码吧,这个例子很好地对python的命名空间概念做了总结:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#manynames.py
#解释命名空间对象
X = 11 #global , X or manynames.X
def f():
print X
def g():
X = 22 # 函数本地作用域
print x
class C:
X = 33 # 类属性,C.X
def m(self):
X = 44 # 函数本地作用域
self.X = 55 # 实例属性(instance.X)
|
从上到下,这里对X的赋值语句会产生:模块属性(11),本地变量(22),类属性(33),方法中的本地变量(44)以及实例属性(55)
这个例子把命名空间的几种情况集合起来了。
我们运行一下,就一目了然了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# manynames.py ,接上面
if __name__=='__main__':
print X #11
f() #11
g() #22
print X #11
obj = C()
print obj.X #33
obj.m()
print obj.X #55
print C.X #33
#print C.m.X[26] #失败:只在函数内可见,只有当函数调用时,X才会存在与内存中
#print f.X #失败:只在函数内可见
|
我们再来做个模块间读取变量的实验:
1
2
3
4
5
6
7
|
import manynames
X = 66
print X #66
print manynames.X #11
print manynames.f() #11
|
manynames.f()打印的是manynames中的X而不是本文件中的X。
这里说明作用域总是由源代码中的赋值语句的位置决定的。
还有再说一点,就去吃饭啦~实际项目在,每个变量不应该用通样的变量名!!
走起