• 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】
  • 相关阅读:
    56. Merge Intervals
    Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths CodeForces
    CodeForces 1328E-Tree Queries【LCA】
    2^x mod n = 1 HDU
    CodeForces 1327D
    CodeFoeces 1327E
    AtCoder Beginner Contest 159 E
    牛客14648-序列【莫比乌斯反演+容斥定理】
    完全平方数 HYSBZ
    MongoDB学习笔记(六、MongoDB复制集与分片)
  • 原文地址:https://www.cnblogs.com/JayveeYao/p/5610030.html
Copyright © 2020-2023  润新知