Python中文
首页
教程
问答
标签
搜索
登录
注册
python中变量的生存期
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<blockquote> <p><strong>Possible Duplicate:</strong><br/> <a href="https://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument">“Least Astonishment” in Python: The Mutable Default Argument</a> </p> </blockquote> <p>考虑以下两个函数</p> <pre><code>def a(var=[0]): print (var) var = var + [4] def b(var=[0]): print (var) var.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(4) </code></pre> <p>它们的行为应该相同,但更重要的是,如果调用时没有参数,则两者都应该简单地打印“[0]”。行为完全不同,只有a()会一直打印'[0]'。在</p> ^{pr2}$ <p>为什么a()函数与b()函数不同?在</p> <p>如果希望在函数没有参数通过的情况下用默认值覆盖变量,那么似乎不能使用list API。如果你这样做的话,函数会“记住”变量之前是什么。在</p> <p><strong>我的代码中的情况出现在递归函数中,所以仅仅“删除”不需要的变量并不能真正起作用。有没有办法在每次不带参数的情况下调用函数时重写一个变量?</strong></p> <p>经过数小时的研究,我发现了这一点。它可能与上述问题有关,并可能导致答案。我们可以这样定义生命周期类:</p> <pre><code>class lifetime: # adapted from http://naml.us/blog/tag/variable-lifetime def __init__(self, name): self.name = name print ('creating: ' + name) def __del__(self): print ('destroying: ' + self.name) def __iadd__(self, a): self.append(a) def append(self, a): self.name += ' and ' + a.name print('appending: ' + a.name + ' to ' + self.name) </code></pre> <p>然后定义2个函数:</p> <pre><code>def a(var=lifetime('a')): print (var) var += life('appendage') def b(var=lifetime('b')): print (var) var.append(life('appendage')) >>> a() <__main__.lifetime object at 0x00000000031FFA90> creating: appendage appending: appendage to a and appendage destroying: appendage >>> a() <__main__.lifetime object at 0x00000000031FFA90> creating: appendage appending: appendage to a and appendage and appendage destroying: appendage >>> b() <__main__.lifetime object at 0x00000000031FFB38> creating: appendage appending: appendage to b and appendage destroying: appendage >>> b() <__main__.lifetime object at 0x00000000031FFB38> creating: appendage appending: appendage to b and appendage and appendage destroying: appendage </code></pre> <p>它似乎只对参数的默认值求值一次,然后使用该值的任何值。它从不说“创造:a”或“创造:b”。所以,如果每次都计算默认参数,可能会得到实际问题的答案。在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>正如您所说,当函数被声明时,这些默认值只计算一次。这就是为什么将列表或散列文本指定为默认值从来都不是一个好主意,因为对于所有函数调用,您只能得到一个实例。在</p> <p>这个问题被描述为<a href="http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/" rel="nofollow">here</a>。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
我想从用户inpu创建一个类的实例
8 回答
我想从用户导入值,为此
5 回答
我想从用户那里得到一个整数输入,然后让for循环遍历该数字,然后调用一个函数多次
9 回答
我想从用户那里收到一个列表,并在其中执行一些步骤,然后在步骤完成后将其打印回来,但它没有按照我想要的方式工作
10 回答
我想从用户那里获取输入,并将值传递给(average=dict[x]/6),然后在那里获取resu
5 回答
我想从第一个列表中展示第一个词,然后从第二个列表中展示十个词,以此类推- Python
4 回答
我想从第一个空lin开始解析文本文件
6 回答
我想从简历、简历中提取特定部分
2 回答
我想从给定字典(python)的字符串中删除\u00a9、\u201d和类似的字符。
6 回答
我想从给定的网站Lin下载许多文件扩展名相同的Wget或Python文件
10 回答
我想从网上搜集一些关于抵押贷款的数据
10 回答
我想从网站上删除电子邮件地址
8 回答
我想从网站上读取数据该网站包含可下载的文件,然后我想用python脚本把它发送给oracle如何?
10 回答
我想从网站中提取数据,然后将其显示在我的网页上
4 回答
我想从网页上提取统计数据。
8 回答
我想从网页上解析首都城市,并在用户输入国家时在终端上打印它们
4 回答
我想从色彩图中删除前n个颜色,而不丢失原始颜色数
10 回答
我想从课堂上打印字典里的键
7 回答
我想从费用表中获取学生上次支付的费用,其中学生id=id
5 回答
我想从较低的顺序对多重列表进行排序,但我无法在一行中生成结果
3 回答