class Tag(object): def __init__(self,name): self.name = name self.links = [] def __repr__(self): return "<Tag {0}>".format(self.name) def link(self,tag): self.links.append(tag)def tag_chain(tag,kNown=[]): chain = [] if tag not in kNown: kNown.append(tag) print "KNown: {0}".format(kNown) for link in tag.links: if link in kNown: continue else: kNown.append(link) chain.append(link) chain.extend(tag_chain(link,kNown)) return chaina = Tag("a")b = Tag("b")c = Tag("c")a.link(b)b.link(c)c.link(a)o = tag_chain(a)print "Result:",oprint "------------------"o = tag_chain(a)print "Result:",o
结果:
KNown: [<Tag a>]KNown: [<Tag a>,<Tag b>]KNown: [<Tag a>,<Tag b>,<Tag c>]Result: [<Tag b>,<Tag c>]------------------KNown: [<Tag a>,<Tag c>]Result: []
所以,不知何故,我不小心创建了一个闭包.据我所见,已知应该已经超出范围并在函数调用完成后消失.
如果我将chain_Tags()的定义更改为未设置默认值,则问题就会消失:
...def tag_chain(tag,kNown):...o = tag_chain(a,[])print "Result:",oprint "------------------"o = tag_chain(a,o
为什么是这样?
解决方法 这是Python中常见的错误:def tag_chain(tag,kNown=[]): # ...
kNown = []并不意味着如果已知notpplIEd,则将其设为空列表;事实上,它与“匿名”列表相关联.每次知道默认为该列表时,它都是相同的列表.
在这里做你想要的典型模式是:
def tag_chain(tag,kNown=None): if kNown is None: kNown = [] # ...
如果未提供,则正确初始化已知的空列表.
总结以上是内存溢出为你收集整理的python – 为什么设置一个默认参数值使这个函数成为一个闭包?全部内容,希望文章能够帮你解决python – 为什么设置一个默认参数值使这个函数成为一个闭包?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)