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

标签 python list class

我有两个不同的类

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 实例并添加不同的 channel 时,为什么两个列表保持相同的 channel ?

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

最佳答案

问题出在这里:

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

关于当我更改其他对象列表时,Python 对象列表不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390584/

相关文章:

python - 关于 yaml 架构验证的错误(此处不允许映射值)是什么意思?

r - 如何计算多个列表中向量的平均值?

字典列表键的 Python 总和

java - 设置值并调用 get 方法后程序返回 0?

python - Dash/plotly,仅显示直方图中的前 10 个值

python - 在wxpython的面板中嵌入网格

javascript - 单击时的 CSS 列表垂直菜单

javascript - 在 es6 中调用另一个类的函数

JavaScript JS 类方法用于更改从另一个方法作为参数发送的属性值

Python正则表达式匹配日期