飘逸的python - 常见的几个坑

混用空格和tab

python是严格缩进的,全用空格或者全用tab就没错,如果是混用就会有问题。如果用vim开发的话,一般是在配置中把tab转成4个空格。

用可变对象作为默认参数

def f(a=[]):
a.append('kzc')
return a
>>> f()
['kzc']
>>> f()
['kzc', 'kzc']
>>> f()
['kzc', 'kzc', 'kzc']

同一个引用

>>>a = range(3)
>>>a
[0, 1, 2]
>>>b = a
>>>b
[0, 1, 2]
>>>b[0]='kzc'
>>>b
['kzc', 1, 2]
>>>a
['kzc', 1, 2]
可以看到,改变b时,a也跟着变了。这是因为赋值的是引用。其实a和b指向同一个对象。
可以用b = a[:]或者b = a+[]解决。
上面的解决方法是浅拷贝的,如果列表a比较复杂,比如列表里面嵌套列表,就需要深拷贝才能彻底解决了。
即利用copy模块,b = copy.deepcopy(a)。
顺带,字典也是引用。

遍历的时候改变值

>>>arr = ['a','b','c','kzc']
>>>for i in arr:
....: if i!='kzc':
....: arr.remove(i)
....:
>>>arr
['b', 'kzc']
为什么结果会是这个呢,我可是要把不等于'kzc'的元素删了的。
这是因为遍历的跟删除的是同一个引用,同一个对象。
一开始,遍历到第一个元素'a','a'不满足被删掉,arr列表就变成了['b','c','kzc']了,然后i继续往下遍历到第二个元素,注意,这时候arr列表被改变了,第二个元素成了'c'了,于是'b'就漏掉了。

不同类型也能比较

尤其是字符串跟整型搞混,
>>>'32'>63
True
由于存到redis数据库中的都是字符串,有时候取出来的时候忘记转成整型,造成损失。
有一次操作玩家的数值的时候,本来是要加32*3即96的,结果成了'32'*3即'323232'了。

元组的陷阱

>>>[i for i in ['foo']]
['foo']
>>>[i for i in ('bar')]
['b', 'a', 'r']
元组只有一个元素时必须加逗号
尽量用列表吧,不要因为元组的效率比列表好,除非是频繁的调用,次数很多,否则这点性能是微不足道的。

你可能感兴趣的:(Python)