我正在编写一个应用程序,其中标记是可链接的,并且需要检索整个链接标记链。不允许自引用。运行下面的代码有一些非常奇怪的结果结束了:为什么设置一个默认参数值使该函数关闭?
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 chain
a = Tag("a")
b = Tag("b")
c = Tag("c")
a.link(b)
b.link(c)
c.link(a)
o = tag_chain(a)
print "Result:", o
print "------------------"
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 b>, <Tag c>]
Result: []
所以,不知何故,我不小心把创建一个封闭。据我所知,已知的应该已经超出了范围,并且在函数调用完成后就离开了。
如果我改变chain_tags()不设置默认值的定义,问题消失:
...
def tag_chain(tag, known):
...
o = tag_chain(a, [])
print "Result:", o
print "------------------"
o = tag_chain(a, [])
print "Result:", o
这是为什么?
感谢您的明确答复。我习惯Python比这更明确。如果有人知道这个决定背后的理由,我会非常有兴趣看到它。 – 2010-11-04 12:33:09