Python语言学习讲解四:常见的几个坑

来源:互联网 发布:恢复出厂设置了怎么恢复数据 编辑:程序博客网 时间:2024/06/05 04:51

版权声明:本文为博主原创文章,未经博主允许不得转载。

1、混用空格和tab

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

 

2、用可变对象作为默认参数

def f(a=[]):

a.append('kzc')

return a

>>> f()

['kzc']

>>> f()

['kzc', 'kzc']

>>> f()

['kzc', 'kzc', 'kzc']

 

3、同一个引用

>>>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)。

顺带,字典也是引用。

 

4、遍历的时候改变值

>>>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'就漏掉了。

 

5、不同类型也能比较

尤其是字符串跟整型搞混,

>>>'32'>63

True

由于存到redis数据库中的都是字符串,有时候取出来的时候忘记转成整型,造成损失。

有一次操作玩家的数值的时候,本来是要加32*3即96的,结果成了'32'*3即'323232'了。

 

6、元组的陷阱

>>>[i for i in ['foo']]

['foo']

>>>[i for i in ('bar')]

['b', 'a', 'r']

元组只有一个元素时必须加逗号

尽量用列表吧,不要因为元组的效率比列表好,除非是频繁的调用,次数很多,否则这点性能是微不足道的。

0 0