Discuss / Python / 不知道这样理解对不对

不知道这样理解对不对

Topic source

哎呀博雅

#1 Created at ... [Delete] [Delete and Lock User]

那么把(1, 2, 3)和(1, [2, 3])分别放入dict或set中,可以看到

  • dict d={(1,2,3)}
    • >>>d
    • {(1,2,3)}
    • len(d) >>>1
    • 正常运行,但是可以看出,原本可以增删改查的dict不能对内部对象进行修改了,原因就是,dict内部指向的对象是一个不可变的tuple。
  • dict d={(1, [2, 3])}
    • Traceback (most recent call last):
    • File "<stdin>", line 1, in <module>
    • TypeError: unhashable type: 'list'
    • // 提示无法使用类型,改下代码
    • d={(1, [2, 3]}
    • //给内部括号去掉变成不是tuple
    • Traceback (most recent call last):
    • File "<stdin>", line 1, in <module>
    • TypeError: unhashable type: 'list'
    • //还是不行
    • 按照提示,“类型错误,不能使用不可哈希的类型list”说人话就是你这个类型的代码不能这么用,因为里面有个对象list可以改变,我是一个从开始定义就不能改变的代码,给你报个错。//unhashable的意思是不可哈希,就是指其可变,如列表,字典等,都是能原地进行修改的。hashable的意思是可哈希,就是不可变,如字符串、元组(tuple)那样,不能原地修改
  • 可以看出dict内对象除了可哈希类型,其他都不行
  • set b = set((1, 2, 3))
    • >>>b
    • {1, 2, 3}
    • //执行下添加命令
    • >>> b.add(4)
    • >>> b
    • {1,2,3,4}
    • //添加对象成功
    • 发生了什么,不是说tuple元组是不可变的吗~~为什么还出现了可以添加对象到tuple元组的情况?
    • //执行删除
    • b.remove(4)
    • >>> b
    • {1,2,3}
    • //也可以使用
    • //换另一个代码
    • b = set((1, [2, 3]))
    • Traceback (most recent call last):
    • File "<stdin>", line 1, in <module>
    • TypeError: unhashable type: 'list'
    • //提示不可哈希,类型错误:list
    • 不可变的类型tuple变化了,可变的list报错了,为什么呢,原因是set不存储value所以需要一个list或者tuple来作为输入集合,可以理解为set这个类型对其包含的数据的一个形式上的要求(可以理解必须这么写,不这么写头打歪),这里并不是list作为set的key,而是list中的元素作为set的key。
    • 换句话说,无论准备将任何元素装入set,它都必须先是一个list或tuple的形式,甚至是空集也得是一个 [] 或()
    • 之所以set([1,2,3])和set((1,2,3))通过,是因为,set()传递了一个可迭代的对象,然后set()返回了一个集合{1,2,3},但set中出现了一个可变对象list【b = set((1, [2, 3]))】[2,3],list属于可变对象,所以不成功。
    • 同理 set{[1,2,3]}和 set{(1,2,3)}都是可变对象,所以不符合可哈希原则,那就无法被执行
    • 可变对象包括
      • 字典 {dict}
      • 集合 sets()
      • 列表 [list]
    • 不可变对象包括
      • 整型 int(1 ,2, 3, 4)
      • 字符串 string('你好')
      • 浮点型 float(3.1415926)
      • 元组 s=(1,2,3.14159,'你好')

  • 1

Reply