学习者-小刈 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日