返回列表为空的Python

-5 投票
2 回答
718 浏览
提问于 2025-04-18 06:39

我有点困惑,想知道在Python中怎么返回一个列表。下面的代码返回了一个空列表。我不太明白这些函数是怎么工作的。

from pysnmp.entity import engine, config
from pysnmp import debug
from pysnmp.entity.rfc3413 import cmdrsp, context, ntforg
from pysnmp.carrier.asynsock.dgram import udp
from pysnmp.smi import builder

import threading
import collections
import time

MibObject = collections.namedtuple('MibObject', ['mibName',
                                   'objectType', 'valueFunc'])

list1 = []
class Mib(object):
    """Stores the data we want to serve. 
    """

    def __init__(self):
        self._lock = threading.RLock()
        self._test_count = 0
        self._test_get = 10
        self._test_set = 0 

    def getTestDescription(self):
        return "My Description"

    def getTestCount(self):
        with self._lock:
            return self._test_count

    def setTestCount(self, value):
        with self._lock:
            self._test_count = value

    def getTestGet(self):
        return self._test_get

    def getTestSet(self):
        return self._test_set

    def setTestSet(self):
        with self._lock:
            self._test_set = value

class Main (list):

    def doObjects(self, list1):

        mib = Mib()
        self.list1.append(MibObject('MY-MIB', 'testDescription', mib.getTestDescription))
        self.list1.append(MibObject('MY-MIB', 'testCount', mib.getTestCount))

        return self.list1

    print list1

为什么这个函数会返回一个空列表呢?

2 个回答

0

这是一个关于变量作用域的问题。实际上,你有三个不同的对象叫做 list1

  • 第一个是全局变量 list1 = [],你在 Mib 类之前就给它赋值了。
  • 第二个是 Main 类的 list1 属性。这个属性实际上并不存在,因为你从来没有在任何地方设置过它。所以当你调用 doObjects 时,会出现 AttributeError 的错误。
  • 第三个是 doObjects 函数里有一个叫 list1 的参数,但这个参数在任何地方都没有被使用。

现在,在 Main 类中执行的打印语句是在类创建时运行的,它打印的是全局的 list1 变量,而这个变量是三个中唯一在这个作用域内可见的。由于你从来没有往这个列表里添加任何东西,所以它当然是空的。

顺便提一下,你的代码里还有很多其他问题,可能需要花点时间学习一下 Python 的基础知识。你的 Main 类没有必要继承 list 这个父类。你从来没有创建过你类的实例。实际上,你的代码除了声明两个类和一个 namedtuple 类之外,什么也没做……

0

照目前的情况,你的代码应该是没有任何作用的。

我猜你是以某种方式在调用 Main() 这个函数。但是,函数 doObjects 从来没有被调用过。此外,你可能忘了在函数定义中加上 self.list1 = list1

一个好的做法是在你的脚本最后加上:

M = Main()
return_list = M.doObjects()
print return list

而你的 Main 函数可以/应该是:

class Main(list):

    def doObjects(self, list1):
        self.list1 = list1
        mib = Mib()
        self.list1.append(MibObject('MY-MIB', 'testDescription', mib.getTestDescription))
        self.list1.append(MibObject('MY-MIB', 'testCount', mib.getTestCount))
        return self.list1

不过,list1 是在 Main 外面定义的,我觉得你应该重新考虑一下你的工作流程。

撰写回答