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

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

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']

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值