返回列表为空的Python
我有点困惑,想知道在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
外面定义的,我觉得你应该重新考虑一下你的工作流程。