学习者-小刈 2022-02-28 20:32 采纳率: 50%
浏览 15
已结题

能帮我看看这一段代码为啥报TypeError吗?

能帮我看看这一段代码为啥报TypeError吗?
[code=python]
def init():
return {"pre": None, "key": None, "value": None, "next": None}
def set(dict, key, value):
node = dict
while node is not None:
if node['key'] == key:
return
node = node['next']
node['next'] = {"pre": node, "key": key, "value": value, "next": None}

def get(dict, key):
node = dict
while node is not None:
if node['key'] == key:
return node['value']
node = node['next']
def exist(dict, key):
node = dict
while node is not None:
if node['key'] == key:
return True
node = node['next']
return False
if name == 'main':
dict = init()
for i in range(10):
key = "key_{}".format(i)
value = i
set(dict, key, value)
test_key = "key_4"
if exist(dict, test_key):
test_value = get(dict, test_key)
print("key is: {}, value is: {}".format(test_key, test_value))
[/code]

  • 写回答

3条回答 默认 最新

  • laoyouzhazi 2022-03-01 00:53
    关注

    TypeError是操作符左右变量类型不一致,
    node[key]有可能是None。
    在set(dict, key, value)里有此类问题:

    def set(dict, key, value):
        node = dict
        while node is not None:
            if node['key'] == key:
                return        
            node = node['next']
            # Bug
            # assert node['next'] is not None
            # or
            # assert node is not None
            node['next'] = {"pre": node, "key": key, "value": value, "next": None}
    

    假设循环到了最后一个node节点,

    while node is the last node,
    node['next'] = None,
    node = node['next'] = None,
    node['next'] = ... # ?!
    

    node已经是None,故node['next']本身会报错,再赋值肯定也会报错。

    def set(dict, key, value):
        node = dict
        while node is not None:
            if node['key'] == key:
                # node['value'] = value
                return
            # 判断是否最后一个node节点
            if node.get('next', None) is None:
                node['next'] = {"pre": node, "key": key, "value": value, "next": None}
                break
            else:
                node = node['next']
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画