python – 为什么设置一个默认参数值使这个函数成为一个闭包?

python – 为什么设置一个默认参数值使这个函数成为一个闭包?,第1张

概述我正在编写一个应用程序,其中标签是可链接的,并且需要检索整个链接标签链.不允许自我引用.运行以下代码最终会得到一些非常奇怪的结果: class Tag(object): def __init__(self, name): self.name = name self.links = [] def __repr__(self): return "<Tag {0}>". 我正在编写一个应用程序,其中标签是可链接的,并且需要检索整个链接标签链.不允许自我引用.运行以下代码最终会得到一些非常奇怪的结果:

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 – 为什么设置一个默认参数值使这个函数成为一个闭包?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存