这两天阅读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。
这里说明作用域总是由源代码中的赋值语句的位置决定的。

还有再说一点,就去吃饭啦~实际项目在,每个变量不应该用通样的变量名!!

走起