<p>从技术上讲,按你的要求做是可能的……但这不是个好主意。里亚德的回答是用Python的方式来做这件事。</p>
<p>在Python 3中:</p>
<pre><code>>>> def f(x=1, y=2, z=3):
... print(x, y, z)
>>> f()
1 2 3
>>> f.__defaults__ = (4, 5, 6)
4 5 6
</code></pre>
<p>与所有隐藏在文档中且难以在文档中找到的内容一样,<a href="http://docs.python.org/3/library/inspect.html">^{<cd1>}</a>模块图是查找函数属性的最佳位置。</p>
<p>Python 2中的细节略有不同,但想法是相同的。(只需将docs页面左上角的下拉菜单从3.3更改为2.7。)</p>
<hr/>
<p>如果您想知道当Python只有一个元组时,它是如何知道哪些默认值与哪些参数一起使用的……它只是从末尾开始倒数(或者是<code>*</code>、<code>*args</code>、<code>**kwargs</code>的第一个值——之后的任何值都进入<code>__kwdefaults__</code>dict)。<code>f.__defaults = (4, 5)</code>将默认值设置为<code>y</code>,<code>z</code>设置为<code>4</code>和<code>5</code>,默认值为<code>x</code>。这是因为在默认参数之后不能有非默认参数。</p>
<hr/>
<p>在某些情况下,这是行不通的,但即使这样,您也可以将其永久复制到具有不同默认值的新函数:</p>
<pre><code>>>> f2 = types.FunctionType(f.__code__, f.__globals__, f.__name__,
... (4, 5, 6), f.__closure__)
</code></pre>
<p>在这里,<a href="http://docs.python.org/3.3/library/types.html#types.FunctionType">^{<cd12>} module</a>文档并没有真正解释任何东西,但是交互解释器中的<code>help(types.FunctionType)</code>显示了所需的参数。</p>
<hr/>
<p>只有内置函数才是<em>不能</em>句柄的情况。但它们通常没有实际的默认值;相反,它们在C API中伪造了类似的东西。</p>