Python踩坑总结
最近一段时间,看了一些算法的python源码,也用python写了一些简单的实现,在python使用上踩了一些小坑,也通过这些坑学习了一些看代码写代码的时候常用的知识点,在这里开个文章做总结,定期更新。
1. list的引用
list是python中的可变数据类型,赋值和传参的时候传递的是对象的引用,修改list值不会单独分配内存,因此会影响所有相同引用的变量。在list传参赋值时需要多加注意,尽量都采用浅拷贝的方式。此外,dict, set和list一样也是可变数据类型,也存在这个问题,同样需要注意。
>>> class D:
def __init__(self, lst):
self.lst = lst
def getFirst(self):
return self.lst.pop(0)>>> a = [1, 2, 3]>>> d = D(a)>>> a.getFirst()1>>> a #a, d.lst是同一对象的两个引用[2, 3]
2. 变量名和方法名前后的下划线
单下划线开头:受保护变量/方法,类对象和子类可以直接访问到,但外部无法import
双下划线开头:私有变量/方法,python名称改编特性会将双下划綫开头的名称(以__var为例)改为"_classname__var",以实现私有特性。外部直接访问时会报错找不到变量('classname' object has no attribute '__var')
双下划线开头双下划线结尾:内置变量如__init__,或特殊方法如def __init__,可以直接访问
单下划线结尾:为避免与python关键字冲突
3. TBC