python中的那些坑

##  所谓坑,就是想象效果跟实际效果不一致的,导致容易出错、出错时还百思不得其解、被坑了很久才搞清楚的。o(╯□╰)o

1) 可变数据类型:

     list和dict为可变数据类型, = 操作符是"传引用",类似C中的传指针, 要做成"传值"建议用copy.deepcopy()

     # 区分"传引用:赋值操作符/return语句"、"传值:deepcopy()"

2) 全局变量:

    不建议直接使用,推荐放在独立模块下、或类变量。

    一定要用时,记得global声明,否则会当作局部变量处理。

3) 与包/模块名称冲突:

    自己便携的脚本名、文件夹名,不要与"包/模块名"一致,否则会出现莫名奇妙的错误

4) 正则表达式:

    如果要匹配上 " ", 必须设置 flags=re.S, 否则是无法匹配上回车符的。

5) 类变量的3种调用方式(对象>类>基类):

    自己的总结(不一定完全正确): ① 优先级 对象>类>基类  ② 优先级高的类变量未经过__setattr__激活前,__getattr__会引用次一级优先级中的值, 激活后独立 ③不同类变量之间的激活记录独立

    测试代码:

 1 # encoding=utf-8
 2  
 3 class A(object):
 4     V1 = 'V1'
 5     V2 = 'V2'
 6 #end class
 7 class B(A):
 8     pass
 9 #end class
10  
11 if __name__ == '__main__':
12     def if_main():
13         pass
14     ifDemoScript = False
15     ifCLIMode = False
16  
17     print u"0> 类变量V1/V2在 类B/对象b都未激活__setattr__之前,统一引用基类A中的值"
18     b = B()
19     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1', 'V1', 'V1', (), 'V2', 'V2', 'V2')
20  
21     print u"1.1> 类变量V1在 类B/对象b都未激活__setattr__之前,基类A中改变时,B/b都(引用式)被改变"
22     A.V1 = 'V1.A'
23     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A', 'V1.A', 'V1.A', (), 'V2', 'V2', 'V2')
24     print u"1.2> 类变量V1在 仅激活类B的__setattr__时,B中改变时,b(引用式)被改变, 但A不受影响"
25     B.V1 = 'V1.B'
26     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A', 'V1.B', 'V1.B', (), 'V2', 'V2', 'V2')
27     print u"1.3> 类变量V1在 B/b都激活__setattr__时,b中改变时,A/B都不受影响"
28     b.V1 = 'V1.b'
29     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A', 'V1.B', 'V1.b', (), 'V2', 'V2', 'V2')
30     print u"1.4> 类变量V1在 B/b都激活__setattr__时,重新尝试单独改变A/B/b,都相互不受影响"
31     A.V1 = 'V1.A2'
32     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B', 'V1.b', (), 'V2', 'V2', 'V2')
33     B.V1 = 'V1.B2'
34     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b', (), 'V2', 'V2', 'V2')
35     b.V1 = 'V1.b2'
36     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2', 'V2', 'V2')
37  
38     print u"2> 验证类变量V2与V1之间的激活独立性"
39     A.V2 = 'V2.A'
40     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A', 'V2.A', 'V2.A')
41     b.V2 = 'V2.b'
42     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A', 'V2.A', 'V2.b')
43     A.V2 = 'V2.A2'
44     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.A2', 'V2.b')
45     B.V2 = 'V2.B2'
46     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.B2', 'V2.b')
47     b.V2 = 'V2.b2'
48     print (A.V1, B.V1, b.V1, (), A.V2, B.V2, b.V2)  # ('V1.A2', 'V1.B2', 'V1.b2', (), 'V2.A2', 'V2.B2', 'V2.b2')
【@JayveeYao】
原文地址:https://www.cnblogs.com/JayveeYao/p/5610030.html