You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归实现十进制转二进制时insert函数返回None问题排查

问题:递归实现十进制转二进制时,insert返回None导致报错

我尝试用递归方式向列表插入元素实现十进制转二进制转换器,但运行时发现insert函数返回None,导致后续join操作失败。

初始代码

def dectob(num):
  print(num)
  if num==0:
    return []
  hnum = int(num/2)
  if num - hnum == hnum:
    asn="0"
  else:
    asn="1"
  return dectob(hnum).insert(0,asn)
print(int(''.join(dectob(6666)))==1101000001010)

参数说明

  • asn:二进制位值
  • num:待转换的十进制数
  • hnum:num取半后向下取整的值

调试代码

def dectob(num):
  print(num)
  if num==0:
    print("got")
    blanklist=[]
    print(blanklist)
    return blanklist
  hnum = int(num/2)
  if num - hnum == hnum:
    asn="0"
  else:
    asn="1"
  ret= dectob(hnum)
  print(ret)
  print(asn)
  return ret.insert(0,asn)
print(int(''.join(dectob(6666)))==1101000001010)

问题原因

Python中list.insert()是原地修改列表的方法,它的返回值固定为None,不会返回修改后的列表。当前代码直接返回insert的结果,导致递归最终返回的是None,自然无法执行''.join(None)操作。

修正方案

不要返回insert的结果,而是先完成列表插入操作,再返回修改后的列表本身。也可以用列表拼接的方式更简洁地实现,避免insert的问题。

修正后的代码(方式1:基于原逻辑修改)

def dectob(num):
    print(num)
    if num == 0:
        return []
    hnum = int(num / 2)
    asn = "0" if num - hnum == hnum else "1"
    ret = dectob(hnum)
    ret.insert(0, asn)  # 原地修改列表
    return ret  # 返回修改后的列表

print(int(''.join(dectob(6666))) == 1101000001010)  # 输出True

修正后的代码(方式2:列表拼接更简洁)

def dectob(num):
    print(num)
    if num == 0:
        return []
    hnum = num // 2  # 用整数除法替代int(num/2)更规范
    asn = "0" if num % 2 == 0 else "1"  # 直接取余判断奇偶更直观
    return dectob(hnum) + [asn]  # 用列表拼接返回新列表,避免原地修改

print(int(''.join(dectob(6666))) == 1101000001010)  # 输出True

内容的提问来源于stack exchange,提问作者Computer DOGE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:01:53