python三种错误_如何避免3个常见Python错误

刚进Python新手村,岔路多又滑,犯错在所难免。我们来看看3个常见的错误和解决方法。

问题:默认可变对象

喂,等等 - Python中的可变对象是什么?可变对象是可以更改的对象。列表,集合和字典都是可变对象。

为了方便说明,我定义一个非常简单且无意义的函数。

def add(x, y=[]):

y.append(x)

return y

在这个add 函数中,我们将y变量默认设置为列表(可变对象)。打印一下看看

def add(x, y=[]):

y.append(x)

return y

print(add('halil'))

print(add('yıldırım'))

输出为:

['halil']

['halil', 'yıldırım']

WTF?!发生了什么?它覆盖了相同的列表。首次调用add('halil')后,默认参数变为y=['halil']并覆盖了同一列表。让我们来看看:

def add(x, y=[]):

y.append(x)

return y

add('halil')

print(add.__defaults__)

add('yıldırım')

print(add.__defaults__)

输出为:

(['halil'],)

(['halil', 'yıldırım'],)

可见,默认列表被覆盖了。

解决方案:默认可变对象

与其传入可变对象作为默认参数,不如改它为None. 如下:

def add(x, y=None):

if y is None:

y = list()

y.append(x)

else:

y.append(x)

return y

print(add('halil'))

print(add('yıldırım'))

输出为:

['halil']

['yıldırım'

问题:复制

让我们先用Python创建一个字典。

a = {'a': 5, 'b': 4, 'c': 8}

接着设置b为a:

a = {'a': 5, 'b': 4, 'c': 8}

b = a

然后删除键为a的第一个元素。

del b['a']

最后看看结果。

a = {'a': 5, 'b': 4, 'c': 8}

b = a

del b['a']

print(b)

print(a)

输出为:

{'b': 4, 'c': 8}

{'b': 4, 'c': 8}

这里又发生了什么?我只是想删除b的第一个元素而已,而不是a......

解决方案:复制

当你赋值b = a时,你事实上是指b和a指向同一对象。如果两个都指向同一个对象,则使用b或a进行操作无区别。两者都会影响这个{'a': 5, 'b': 4, 'c': 8}对象。

一个解法:

import copy

a = {'a': 5, 'b': 4, 'c': 8}

b = copy.copy(a)

del b['a']

print(b)

print(a)

输出为:

{'b': 4, 'c': 8}

{'a': 5, 'b': 4, 'c': 8}

问题和解决方案:命名文件

绝对不要把你的python文件名命名与要调用的库同名。

例如,命名文件为random.py,程序会对你要执行什么操作感到相当困惑。

import random

print(random.random())

print(random.random())

输出为:

File "C:\Users\HalilibrahimYıldırım\Desktop\medium\Python\random.py", line 3, in

print(random.random())

TypeError: 'module' object is not callable

当你明白了这些错误背后的原因,生活自然就变得更美好啦 ;-)

Reference:

3 Common Mistakes You’d Want to Avoid in Python

by Halil Yıldırım

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值