南巷君君 发表于 2022-5-26 15:13:32

047课堂内容求助

class CountList:
   
    def __init__(self,*args):
      self.value =
      
      self.count = {}
      self.count.fromkeys(range(len(self.value)),0)

    def __len__(self):
      return len(self.value)

    def __getitem__(self,key):
      self.count += 1
      return self.value

为什么我定义字典的方式在运行中会报错呢?
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
    c1
File "D:/Python39/047自定义列表.py", line 13, in __getitem__
    self.count += 1
KeyError: 3

改写成书上那样就不报错
self.count={}.fromkeys(range(len(self.value)),0)

isdkz 发表于 2022-5-26 15:17:17

因为你的字典是个空字典,取不出数据


class CountList:
   
    def __init__(self,*args):
      self.value =
      
      self.count = {}
      self.count = self.count.fromkeys(range(len(self.value)),0)            # 这里要赋值

    def __len__(self):
      return len(self.value)

    def __getitem__(self,key):
      self.count += 1
      return self.value

南巷君君 发表于 2022-5-26 15:26:06

南巷君君 发表于 2022-5-26 15:26:48

isdkz 发表于 2022-5-26 15:17
因为你的字典是个空字典,取不出数据

我查看了书上,我那样写也是赋值语句啊

南巷君君 发表于 2022-5-26 15:29:20

isdkz 发表于 2022-5-26 15:17
因为你的字典是个空字典,取不出数据

>>> dict1 = {}
>>> dict1.fromkeys((1,2,3),0)
{1: 0, 2: 0, 3: 0}
>>> dcit1
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
    dcit1
NameError: name 'dcit1' is not defined
>>> dict1
{}
明白了,谢谢前辈,自己试了下

isdkz 发表于 2022-5-26 15:29:58

南巷君君 发表于 2022-5-26 15:26
我查看了书上,我那样写也是赋值语句啊

你赋值的是一个空字典,fromkeys 只会产生一个新的字典,并不会改变原来的字典,

所以你的字典还是一个空字典

>>> count = {}
>>> count.fromkeys(range(5),0)
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
>>> count               # count 还是空字典
{}
>>>

当初约定 发表于 2022-5-26 15:30:05

给你看看一个网址:https://www.runoob.com/python/att-dictionary-fromkeys.html
看下面的笔记,说的是fromkey是负责创建字典的,你这样的写法会造成上面self.count是一个空列表,然后执行到__getitem__函数的时候就会出现错误,书上这么写则是可以创建一个经过初始化的字典赋值给self.count,可以满足字典的操作{:10_279:}我对python还不是很熟悉,但是从查到的资料显示是python有这样的实现机制方面的问题,可以看看前面给你的网址下方笔记的例子

南巷君君 发表于 2022-5-26 15:43:16

谢谢,还是实践的太少了,有不少坑
页: [1]
查看完整版本: 047课堂内容求助