You need to enable JavaScript to run this app. 为什么我用Python实现的自定义有序列表无法添加第二个元素,如何修复?
优惠活动
大模型
产品
解决方案
定价
更多

为什么我用Python实现的自定义有序列表无法添加第二个元素,如何修复?

问题原因
  • 核心问题出在add方法的赋值逻辑:Python类的实例方法中,self是指向当前实例的局部变量,直接对self执行赋值操作(self = xxx)只会改变这个局部变量的指向,不会修改原实例本身。你第一次添加元素时使用self.append(x)属于原地修改列表实例内容,所以修改能同步到外部的sl对象;第二次添加时你直接给self赋值为新拼接的列表,只是让方法内的self指向了新对象,外部的sl实例完全没有发生变化。
  • 额外的逻辑错误:你拼接列表的写法有误,self + [x] + self[index:]会把原列表完整保留后再加新元素和后半段,当插入位置不是列表末尾时会出现元素重复,正确的拼接逻辑应该是self[:index] + [x] + self[index:]。
  • 冗余错误:__init__方法中的self = []完全无效,继承list后父类默认初始化已经会创建空列表,这行代码只是修改局部变量指向,没有任何作用。
修复方案

直接使用bisect算出的插入位置调用列表自带的insert方法原地插入即可,不需要手动拼接列表,也不需要额外判断列表是否为空:

from bisect import bisect
class SortedList(list):
    def add(self, x):
        index = bisect(self, x)
        self.insert(index, x)
修复后完整可运行代码
from bisect import bisect
class SortedList(list):
    def add(self, x):
        index = bisect(self, x)
        self.insert(index, x)

t = 1
for _ in range(t):
    n, a, b = 24, 3, 5
    if b == 1:
        print('yes')
    else:
        sl = SortedList()
        st = set()
        sl.add(1)
        st.add(1)
        i = 0
        while sl[i] < n:
            num1 = sl[i] * a
            num2 = sl[i] + b
            if num1 > sl[i] and num1 not in st:
                sl.add(num1)
                st.add(num1)
            if num2 > 1 and num2 not in st:
                sl.add(num2)
                st.add(num2)
            if n in st:
                break
            i += 1
        print('yes' if n in st else 'no')

运行上述代码会输出yes,符合预期。

内容的提问来源于stack exchange,提问作者Valerie Ogonor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 03:48:03