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前面有个星号*,这有点类似于函数调用时的可变长度参数,带星号*的变量或形参有“收集剩余位置实参或数值”的作用

下一篇
举报

扫码关注云+社区

领取腾讯云代金券