python3 常用数据结构的常见错误

集合set:unhashable type XXX

集合可变,但集合元素是唯一、无序、不可改变的,所以不能将可变对象放入集合中。比如集合、列表、字典对象均不能加入集合中,否则报错TypeError: unhashable type: ‘list’。元祖对象可以加入集合。
list为可变对象
python提供一种特殊的集合——冻结集合(frozenset),它是一种不可变对象,可以作为集合的元素。
这里写图片描述

元祖tuple:’tuple’ object does not support item assignment

-元祖可包含任意类型的对象
-元祖有序,可以索引和分片
-元祖大小不能改变,不能添加或删除元素
-元祖中的对象也不能改变
这里写图片描述
当你对元祖元素进行赋值时,就会发现报错TypeError: ‘tuple’ object does not support item assignment。
但如果该元祖元素是列表,字典这种可变对象,你还可以通过赋值语句(也就是=)以外的语句修改元祖元素。
这里写图片描述

UnboundLocalError

一般出现在函数内部,当在函数内部有一条语句对一个变量进行了赋值,且没有使用对该变量使用global,那么程序就认为该变量为本地变量,不管在外面有没有同名的全局变量。既然认为是本地变量,而且又在使用它之前没有赋过值,那么就会报错UnboundLocalError。

def show():
    print('a=',a)
    a=10
show()

运行结果为:UnboundLocalError: local variable ‘a’ referenced before assignment
就算外部有全局变量a,也一样报错:

a = 100
def show():
    print('a=',a)
    a=10
show()

运行结果为:UnboundLocalError: local variable ‘a’ referenced before assignment。
只要把a=10放在print前面就不会报错了。

使用+=也一样报错,因为等价a=a+10,一样是赋值语句,程序同样认为是本地变量,却没有赋过初值:

def show():
    a+=10    
show()
a=10
def show():
    a+=10   
show()

以上两段代码都会报错:UnboundLocalError: local variable ‘a’ referenced before assignment。

posted @ 2018-06-06 20:06  allMayMight  阅读(154)  评论(0编辑  收藏  举报