我在学习如何正确使用课程时遇到了一些麻烦。我希望下面的代码循环遍历一组文件(它确实如此),在一个集合中添加元素(它确实如此),并在它移动到新文件时启动集合(它不< / em>的)。我在下面的代码中攻击的方式,我希望每次都为file.terminals
返回一个空集,因为我相信每个集都是类{{1}的新实例的唯一属性}。显然,我错了。实际发生的是,第一个文件创建的终端集持续存在(并被添加到)列表中的所有后续文件,尽管其他属性(例如SrcFile
,file.name
)会随之改变。文件。有人可以解释为什么它以这种方式工作以及如何创建我期望的行为?提前感谢您对初级程序员的无知的耐心。
file.seqlength()
答案 0 :(得分:4)
您正在类声明中定义terminals
,而不是在为该类的每个新实例执行的__init__
函数内定义。
基本上,terminals
是为整个类初始化的,而不是为每个类的实例初始化:
>>> SrcFile.terminals
set([])
注意我运行了SrcFile.terminals
,而不是SrcFile().terminals
,这意味着SrcFile
是对类的引用,而不是类的实例。
您将__init__
函数中的变量放在其中以使它们特定于实例:
class SrcFile(object):
def __init__(self, which):
self.name = which
self.terminals = set([])
答案 1 :(得分:3)
通过在类本身中定义terminals = set([])
,在定义类时创建一次,而不是在创建实例时创建。
要避免这种情况,请将其删除,然后将以下内容添加到__init__
方法中:
self.terminals = set()