Python编程常见出错信息及原因分析(3)

(1)不可哈希错误

演示代码:

>>> x = {[1], [2]}
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    x = {[1], [2]}
TypeError: unhashable type: 'list'
>>> x = {[1]:1}
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    x = {[1]:1}
TypeError: unhashable type: 'list'
>>> x = {{'a':97, 'b':98}}
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    x = {{'a':97, 'b':98}}
TypeError: unhashable type: 'dict'

错误原因分析与解决方案:

在Python中,可变的数据不可哈希。一般来说我们并不关心一个数据的哈希值,只关心是否可哈希。集合的元素和字典的“键”要求必须为可哈希数据,例如整数、实数、复数、字符串、元组。如果不小心把列表、字典、集合或类似可变(不可哈希)的数据作为字典的“键”或者集合的元素,会抛出“不可哈希”错误,这种用法要坚决避免。

(2)数据数量不一致错误

在调用函数时,要求实参数量和形参必须数量一致,即使函数有默认值参数,这个要求也是必须满足的,只是有些形参有默认值,所以表面看起来实参数量和形参数量不是完全一样。

>>> def func(a, b, c=5): return a+b+c

>>> func(3)
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    func(3)
TypeError: func() missing 1 required positional argument: 'b'
>>> func(3, 5, 7, 9)
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    func(3, 5, 7, 9)
TypeError: func() takes from 2 to 3 positional arguments but 4 were given

一个比较类似的是序列解包的用法。例如,下面的代码没有任何问题:

>>> x = 3, 5, 7
>>> x
(3, 5, 7)

因为第一个语句中,虽然等号右侧并没有加什么括号,但实际上是作为元组处理的,也就是,把等号右侧的元组(3, 5, 7)赋值给左侧的变量x。

但是,下面的语句是错误:

>>> x, y = 3, 5, 7
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    x, y = 3, 5, 7
ValueError: too many values to unpack (expected 2)

这是因为等号左侧有两个变量,右侧必须有两个值才行,但是现在给了3个,Python解释器就懵了,不知道该怎么办,只好抛出异常。

然而,下面的代码是可以正常执行的:

>>> x, *y = 3, 5, 7
>>> x
3
>>> y
[5, 7]
>>> x, *y = 3, 5, 7, 9, 11, 13
>>> x
3
>>> y
[5, 7, 9, 11, 13]

这是因为等号左侧的变量y前面有个星号*,这有点类似于函数调用时的可变长度参数,带星号*的变量或形参有“收集剩余位置实参或数值”的作用

-----------相关阅读---------

Python编程常见出错信息及原因分析(2)

Python编程常见出错信息及原因分析(1)

-------------请假-------------

明天(2017年9月21日)上午在学校上课,傍晚飞机去北京讲3天Python编程基础与数据分析、科学计算可视化,周一凌晨0:30左右回家,早上7:50学校上课讲Python字典应用案例。所以这几天暂时不更新了。大家可以进入公众号,然后使用菜单“最新资源”==>“历史文章分类速查表”按版块查看和阅读感兴趣的Python技术文章。

----------喜大普奔----------

1、继《Python程序设计基础》《Python程序设计(第2版)》《Python可以这样学》系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3

2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值