#Python学习笔记(day9)——定制序列错误分析
class Seq:
def __init__(self,*argus):
self.storage = [x for x in argus]
self.count = {}.fromkeys(self.storage, 0)
def __len__(self):
return len(self.storage)
def __getitem__(self,key):
print('__getitem__')
self.count[self.storage[key]] += 1
return self.storage[key]
def __setitem__(self,key,value):
print('__setitem__')
self.count[value] = 0
self.count.pop(self.storage[key])
self.storage[key] = value
def __delitem__(self,key):
print('__delete__')
self.storage.pop(key)
self.count.pop(self.storage[key])
定制一个可修改的序列,记录曾出现的问题:
1、下图是不可变序列的代码。在记录元素访问次数时应用了字典,字典的键为该元素在列表中的索引。
但是若将该序列变成可变序列,删除某个元素的时候索引也要发生相应的改变,这样在今后访问元素的时候才不至于出现访问字典时出现键不存在的情况。
解决问题的办法是让字典的索引动态跟随列表的变化。因此采用了self.storage[key]的访问方式,并且将输入元素的实名传入字典的键
2、记录一个类型错误:
TypeError: 'builtin_function_or_method' object is not subscriptable
这个是函数的括号和大括号用反了所致
3、第三个问题是一个顺序问题。如上述红色代码。因为字典是跟随列表而动态变化,所以在删除一个元素时,倘若先把列表中的元素删除,则计算机无法找到列表中的那个值从而无法删除字典中的键值对。所以红色代码顺序应加以调整。
4、第四个问题是给序列赋值时,原来的值被更改,其自然也就不存在访问次数的问题。同时对于新成员也有访问次数的问题,因而要在记录访问次数的列表中删除原来元素,并且增加新的键值对