今天在编写专家系统的时候突然发现使用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()
结果为:

博主在编写专家系统时,遇到使用list.append(a)时a会将list中所有值替换为a的问题。起初以为重写append函数可解决,未成功。后发现是因p、q在循环外,虽每次重新赋值,但地址相同,导致前面数据更新,还给出了正确代码。

5554

被折叠的 条评论
为什么被折叠?



