前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: Can't pop from an empty list

Python: Can't pop from an empty list

原创
作者头像
华科云商小徐
发布2024-07-04 10:20:05
510
发布2024-07-04 10:20:05
举报
文章被收录于专栏:小徐学爬虫

在 Python 中,如果尝试从一个空列表中弹出(pop)元素,会引发 IndexError 异常。这是因为 pop() 方法试图移除并返回列表中的最后一个元素,但在列表为空时无法执行此操作。那么具体情况可以跟着我看看下面文章。

1、问题背景

在编写一个 Python 程序时,由于需要在设备连接时更新设备标签并且将其传递给 Exchange,开发者遇到了一个问题:IndexError: pop from empty list。这表明在尝试从 Welcome.dev_label 列表中弹出元素时,该列表为空。

2、解决方案

为了解决这个问题,需要确保在从 Welcome.dev_label 列表中弹出元素之前,已经将设备标签添加到该列表中。

具体步骤如下:

  1. device_connected 函数中,当设备连接时,将设备标签添加到 Welcome.dev_label 列表。
  2. 在 Exchange 类中,在尝试从 Welcome.dev_label 列表中弹出元素之前,检查该列表是否为空。如果为空,则等待直到列表中有元素后再弹出。

代码例子

修改后的代码如下:

代码语言:javascript
复制
serial_list=[]
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='block',device_type='partition')
observer = GUDevMonitorObserver(monitor)
​
def device_connected(observer, device):
    Welcome.device_count+=1
​
    flag =False
    for iden in serial_list :
        if iden == device.__getitem__('ID_SERIAL_SHORT'):
            flag=True
​
    if flag ==False:
        serial_list.append(device.__getitem__('ID_SERIAL_SHORT'))
        Welcome.dev_label.append(str(device.__getitem__('ID_FS_LABEL')))
        size = len(Welcome.dev_label)
        label = gtk.Label('Device connected :: {0!r}'.format(Welcome.dev_label[size-1]))
        Welcome.vbox.pack_start(label)
        Welcome.window.show_all()
​
    if Welcome.device_count<2:
        label = gtk.Label('Connect the second device')
        Welcome.vbox.pack_start(label)
        Welcome.window.show_all()
​
    else :
        # 等待直到 Welcome.dev_label 列表中有元素后再弹出
        while len(Welcome.dev_label) == 0:
            pass
        Exchange()
​
observer.connect("device-added",device_connected)
monitor.start()
​
class Welcome:
    device_count = 0    
    window = gtk.Window()
    vbox= gtk.VBox(False, 5)
    dev_label = []
​
    def __init__(self):
​
        self.window.set_default_size(300, 300)
        self.window.set_title("Welcome")
​
        label = gtk.Label("Connect the desired device")
​
        self.vbox.pack_start(label)
        self.window.add(self.vbox)
​
        self.window.connect("destroy", lambda q: gtk.main_quit())
        self.window.show_all()
​
class Exchange:
    def __init__(self):
​
        # 确保在从 Welcome.dev_label 列表中弹出元素之前,列表中有元素
        while len(Welcome.dev_label) == 0:
            pass
        window1 = gtk.Window(Welcome.dev_label.pop())
        window2 = gtk.Window(Welcome.dev_label.pop())
​
        width = gtk.gdk.screen_get_default().get_width()
        height = gtk.gdk.screen_get_default().get_height()
​
        self.window1.resize(width/2,height)
        self.window2.resize(width/2,height)
​
        self.window2.move(self.window1.get_position()[0]+width/2, self.window1.get_position()[1])
​
        label = gtk.Label("Hello")
        self.window1.add(label)
​
        self.window1.connect("destroy" , lambda q : gtk.main_quit())
        self.window1.show_all()
​
        label = gtk.Label("World")
        self.window2.add(label)
​
        self.window2.connect("destroy",lambda q : gtk.main_quit())
        self.window2.show_all()
​
Welcome()
gtk.main()

修改后的程序确保在从 Welcome.dev_label 列表中弹出元素之前,已经将设备标签添加到该列表中,从而解决了 IndexError: pop from empty list 的问题。

在实际开发中,确保在操作列表之前检查其状态是一个良好的实践,能够防止许多潜在的错误。使用 try-except 块则是处理异常情况的一种有效方法,能够使程序更健壮并且具有容错能力。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档