【问题标题】:Python Object list keep changing when I change an other object list当我更改其他对象列表时,Python 对象列表会不断变化
【发布时间】:2013-06-27 18:06:26
【问题描述】:

我有两个不同的班级

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 文件并创建一个包含 ircChannel 列表的 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 中的列表,但它不起作用。

【问题讨论】:

标签: python list class


【解决方案1】:

问题出在这里:

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 = []

【讨论】:

    【解决方案2】:

    失去类属性。无论如何,您都没有使用它们。实际上,它会导致您的错误,因为所有实例似乎共享相同的 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 并至少遵循其中的大部分指南

    【讨论】:

      【解决方案3】:

      修改

      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 成为实例属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        相关资源
        最近更新 更多