当我更改其他对象时,Python对象列表会不断更改

2024-03-29 12:57:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的班级

class   ircChannel:
   NAME = ""

   def __init__(self):
      self.NAME = NAME

class   ircServer:
   HOST = ""
   PORT = 0
   CHAN = []

   def __init__(self, HOST, PORT):
      self.HOST = HOST
      self.PORT = PORT

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

我正在解析一个XML文件并创建一个包含ircServer列表的ircServer列表

for server in servers
    ircBot.addServer(ircServer(HOST, PORT))
    for channel in channels 
         ircBot.SERVERS[-1].addChan(ircChannel(channel.name))

当我打印结果的时候,我不断得到副本

ircBot
   Server 1 -
       Channel1
       Channel2
       Channel3
   Server 2 -
       Channel1
       Channel2
       Channel3

但我需要的是

ircBot
   Server 1 -
       Channel1
       Channel2
   Server 2 -
       Channel3

显然,我创建了两个不同的irsServer实例并添加了不同的通道,为什么这两个列表一直有相同的通道?你知道吗

我尝试清空ircServer类的init中的列表,但它不起作用。你知道吗


Tags: nameselfhost列表serverinitportdef
3条回答

丢失类属性。反正你也不用。事实上,它导致了您的bug,因为所有实例似乎共享相同的CHAN列表

class   ircServer:
   def __init__(self, HOST, PORT):
      self.HOST = HOST
      self.PORT = PORT
      self.CHAN = []

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

同时考虑阅读PEP8并至少遵循其中的大部分指导原则

修改

class   ircServer:
   HOST = ""
   PORT = 0

   def __init__(self, HOST, PORT):
      self.CHAN = []
      self.HOST = HOST
      self.PORT = PORT

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

否则CHAN是类属性,对于所有类实例都是相同的。在__init__中执行self.CHAN = []将使CHAN成为实例属性。你知道吗

问题在于:

class   ircServer:
   HOST = ""
   PORT = 0
   CHAN = []

它们是整个类的成员,而不仅仅是它的单个对象(实例)。要修复它,请将其移动到构造函数(__init__):

class   ircServer:
   def __init__(self, HOST, PORT):
       self.HOST = HOST
       self.PORT = PORT
       self.CHAN = []

类成员类似于作用域全局变量。它们有一定的实用性,但似乎对解决这个特殊问题没有帮助。如果有任何情况,它可能是一个默认端口号:

class ircServer:
    DEFAULT_PORT = 44100
    def __init__(self, HOST, PORT = DEFAULT_PORT):
        self.HOST = HOST
        self.PORT = PORT
        self.CHAN = []

相关问题 更多 >