今天在编写专家系统的时候突然发现使用list.append(a)时,a会将list中所有值替换为a。刚开始还以为是用list存自定义对象时需要重写append函数,重写之后还是不起作用,最后发现问题如下:
# 错误代码,只截取关键代码
RuleList = list()
p = set()
q = set()
for i in data:
p.add(value)
k = Rule(no, p, q)
RuleList.append(k)
p.clear()
q.clear()
结果如下:
后来在网上查了资料发现:在每次循环中,list中会增加一个位置用于保存k中数据。但是p,q在循环外。虽然每次都为p,q重新赋值,但这些p,q指的是同一地址,每次赋值都会引起前面所有数据的更新。因此,正确代码应为:
# 正确代码,只截取关键代码
RuleList = list()
p = set()
q = set()
for i in data:
p.add(value)
k = Rule(no, p, q)
RuleList.append(k)
p.set()
q.set()
结果为: