1. 缩进,符号和空格不正确
写代码时大家会使用缩进、对齐、空格等,其目的是为了提高代码的可读性。
但在python语言中,许多功能都依赖于缩进。
比如在创建一个新类时,该类中的所有内容都在声明下缩进,决策、循环还有其它结构语句也会出现类似的情况,
如果你在代码执行时发现问题,可以查看一下是否使用了正确的缩进。
来看看下面的例子,在使用IF语句时,请确保使用正确且合适的冒号和缩进,因为它们会导致语法和缩进错误。
val = 500
if val > 100
print("value is grater then 100")
File "", line 2
if val > 100
^
SyntaxError: invalid syntax
在上面的代码当中,出现了两处错误:if语句后面的:缺失;下一行没有进行正确的缩进,执行代码出错。
val = 500
if val > 100:
print("value is grater then 100")
value is grater then 100
当你更正上述代码中的两个问题后,你会发现整段代码能够很好的运行。
2. 错误使用类变量
class A(object):x = 1
class B(A):pass
class C(A):pass
print( A.x, B.x, C.x)
1 1 1
这里输出的值都是1,然后我们试着来改变一下A.x和B.x的值看看有什么变化。
B.x = 2
print (A.x, B.x, C.x)
A.x = 3
print (A.x, B.x, C.x)
1 2 1
3 2 3
我们只改变了A.x,为什么C.x改变呢?
这里需要简单了解一下python的命名空间。
python中,命名空间是名字到对象映射的结合,不同命名空间中的名字是没有关联的,这种映射的实现有点类似于python中的字典。
当你名字访问一个对象的属性时,先从对象的命名空间寻找。如果找到了这个属性,就返回这个属性的值;如果没有找到的话,则从类的命名空间中寻找,找到了就返回这个属性的值,找不到则抛出异常。
在Python中,类变量在内部作为字典处理,并遵循通常称为方法解析顺序(MRO)的方法