python – 为什么设置一个默认参数值使这个函数成为一个闭包?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 为什么设置一个默认参数值使这个函数成为一个闭包?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1508字,纯文字阅读大概需要3分钟。
内容图文
![python – 为什么设置一个默认参数值使这个函数成为一个闭包?](/upload/InfoBanner/zyjiaocheng/760/f86c92e5a03c4f278ebf724d2bded389.jpg)
我正在编写一个应用程序,其中标签是可链接的,并且需要检索整个链接标签链.不允许自我引用.运行以下代码最终会得到一些非常奇怪的结果:
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中常见的错误:
def tag_chain(tag, known=[]):
# ...
known = []并不意味着如果已知notpplied,则将其设为空列表;事实上,它与“匿名”列表相关联.每次知道默认为该列表时,它都是相同的列表.
在这里做你想要的典型模式是:
def tag_chain(tag, known=None):
if known is None:
known = []
# ...
如果未提供,则正确初始化已知的空列表.
内容总结
以上是互联网集市为您收集整理的python – 为什么设置一个默认参数值使这个函数成为一个闭包?全部内容,希望文章能够帮你解决python – 为什么设置一个默认参数值使这个函数成为一个闭包?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。