Python里的那些坑

Python里的那些坑

列表创建和引用

嵌套列表的创建

列表元素的引用

比较好的方法是:

    for elem in tab:
    print(elem)

for语句会自动生成一个迭代器。如果你需要索引位置和元素,使用enumerate函数:

    for i, elem in enumerate(tab):
        print((i, elem))

注意 == 符号的使用

    if (var == True):
        # 当var是:True、1、 1.0、 1L时if条件成立

    if (var != True):
        # 当var不是 True 和 1 时if条件成立

    if (var == False):
        # 当var是 False 或者 0 (or 0.0, 0L, 0j) if条件成立

    if (var == None):
        # var是None if条件成立

    if var:
        # 当var非空(None或者大小为0)对象 string/list/dictionary/tuple, non-0等if条件成立

    if not var:
        # 当var空(None或者大小为0)对象 string/list/dictionary/tuple, non-0等if条件成立


    if var is True:
        # 只有当var时True时 if条件成立 1也不行

    if var is False:
        # 只有当var时False时 if条件成立 0也不行

    if var is None:
    # 和var == None 一致

捕获异常由于提前检查

比较好的做法:

    try:
        file = open(file_path)
    except OSError as e:
        # do something

在python2.6+的里面可以更简洁:

    with open(file_path) as file:

之所以这么用,是这么写更加通用,比如file_path给你传个None就瞎了,还得判断是不是None,如果不判断,就又得抓异常,判断的话,代码有多写了很多。

类变量初始化

函数默认参数

def foo(li=[]):
    li.append(1)
    print(li)

foo([2])
# Out: [2, 1]
foo([3])
# Out: [3, 1]

该代码的行为与预期的一样,但如果我们不传递参数呢?

foo()
# Out: [1] As expected...

foo()
# Out: [1, 1]  Not as expected...

这是因为函数参数类型是定义是确认的而不是运行时,所以在两次函数调用时,li指向的是同一个list对象,如果要解决这个问题,可以这样:

def foo(li=None):
    if not li:
        li = []
    li.append(1)
    print(li)

foo()
# Out: [1]

foo()
# Out: [1]

这虽然解决了上述的问题,但,其他的一些对象,比如零长度的字符串,输出的结果就不是我们想要的。

x = []
foo(li=x)
# Out: [1]

foo(li="")
# Out: [1]

foo(li=0) 
# Out: [1]

最常用的办法是检查参数是不是None

def foo(li=None):
    if li is None:
        li = []
    li.append(1)
    print(li)

foo()
# Out: [1]

在遍历时修改

整数和字符串定义

列表推导和循环中的变量泄漏

or操作符

转载自我的博客:http://www.bugcode.cn/Python%20Pitfalls.html