说一万遍不如实际踩一次,最常见的坑就是函数传默认参数的时候。
好多人刚学写函数,默认参数写个列表,结果下次调用的时候,上次加进去的内容居然还在!吓不吓人?
我之前写过这么一个代码,坑了我好半天:
def add_item(item, my_list = []): my_list.append(item) return my_list
你第一次调用add_item(1),返回[1],第二次调用add_item(2),你以为会返回[2]吗?错了,返回的是[1,2]!
为啥啊,你想想就懂了,默认参数是在定义函数的时候就创建好的,list是可变类型啊,你每次调用,改的都是同一个内存地址里的内容,当然会保留上次的结果啊!
这就是典型的因为没搞懂可变不可变踩的坑,我当时刚学的时候,看到结果整个人都懵了,以为Python出bug了。
后来搞懂了之后,才发现这个坑就是专门给新手准备的,好多人学了半天概念,一到实际用就错。
还有一个坑就是赋值的时候,比如a = [1,2,3],然后b = a,你改b[0] = 10,你回头看看a,居然也变了!为啥啊,因为a和b指向的是同一个内存地址啊,列表是可变类型,你改b就是改那块内存里的内容,a当然也跟着变了。
如果是不可变类型呢?比如a = 10,b = a,然后b = 20,这时候a还是10啊,因为b赋值20的时候,直接换了个内存地址,跟原来a没关系了。
就这一点,多少人搞混了啊。