http://bookshadow.com/weblog/2014/05/14/top-10-mistakes-that-python-programmers-make/
PyCharm中Python代码提示:Shadows name from outer scope
函数内部的变量,如果和函数被调用的外部的变量一样的话,就被PyCharm中叫做shadows name,这样的话,容易引发不容易觉察到的,由于函数内部和外部的变量名一致而引发的一些问题:
比如:内部函数名引用时不小心写错了时,就会导致其实调用了外部变量名,从而导致逻辑错乱。
所以解决办法是:
确保函数内部和外部的变量名不要重复,这样就不会导致可能由此导致的错误了。
1.list索引超出范围
list_1 = []
print list_1[3] # IndexError: list index out of range
2.除法
整型地板除:在python2、C、C++、Java中常见,特点是整数相除舍弃小数取整,浮点数相除则保留小数(如果有);
1 >>>1/2
2 0
3 >>>1.0/2.0
4 0.5
完全地板除:只留整数的除法,特点是无论整数还是浮点数,均不保留小数(如果有);
>>>1//2
0
>>>1.0//2.0
0.0
精确除法。特点是无论整数还是浮点数,均保留小数(如果有)。
python2中需要在开头加上 from __future__ import division; python3中 / 默认的为精确除法,因此python2的代码在python3里,整形相除的运算结果都会变化;
from __future__ import division
1 >>>1/2
2 0.5
3 >>>1.0/2.0
4 0.5
Tip : 表达式中除法运算时,除非只要保留整数,最好用浮点数代替整数,如 2/3 写成 2.0/3 或 2/3.0 或 2.0/3.0 ,特别是表达式中存在大量符号运算时,(....)/(....) 往往会得到意想不到的结果。
3.类继承时,若子类重写了__init__()方法,则父类的__init__()方法不会在子类实例化时执行。此时,若子类和父类中的相关方法,用到了,在父类的__init__()方法中定义的一些数据成员,运行时会出现该数据成员未定义的报错;
解决此错误,需要在子类中显示调用父类__init__()方法,类似如下:
class WalkManager(WalkPlaner):
def __init__(self):
print " WalkManager.__init__() run"
# super(WalkManager, self).__init__() # super()调用父类__init__(),否则,父类__init__()不会运行;
WalkPlaner.__init__(self) # 直接调用父类__init__(),self不能省略
4.
python中万物皆为对象,用None表示一个空对象。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。可以将None赋值给任何变量,也可以给None值变量赋值。
>>>type(None)
<class 'NoneType'>
5.随机数 random()
random()产生的是[0,1)范围内的随机数,不同于C++中的rand()函数,该每次运行产生的随机数不同;
C++中的rand()函数,每次运行产生的随机数相同,可借助于srand(seed)函数,来产生不同的随机数,但前提是,每次的seed要不同;
from random import random
for i in range(10):
print " random {} = {}".format(i, random())
结果如下:
random 0 = 0.593180204205
random 1 = 0.0984847619278
random 2 = 0.303697634057
random 3 = 0.44980140159
random 4 = 0.575947041285
random 5 = 0.782555323799
random 6 = 0.10262314415
random 7 = 0.567161032414
random 8 = 0.480536145764
random 9 = 0.328421075104
6.