<blockquote>
<p>What happens now? line_count = 3 or will it be line_count= current_line = 3?</p>
</blockquote>
<p>在对<code>print_a_line</code>的调用中,<code>line_count</code>被绑定到3。变量<code>current_line</code>不受调用的影响。在</p>
<blockquote>
<p>Also, is it a bad thing if I pass different argument names(like I did here with current_line instead of line_count?)</p>
</blockquote>
<p>这一点都不是坏事。您使用的是位置参数而不是命名参数。在</p>
<p>在Python中,有两种类型的参数:位置参数和命名参数。像上面的<code>print_a_line</code>函数一样声明的函数只使用位置参数。只有命名参数的函数可能看起来像</p>
<pre><code>def print_a_line_2(line_count=3, f=None):
if f is not None:
print line_count, f.readline()
</code></pre>
<p>同时具有位置参数和命名参数的函数可能看起来像</p>
^{pr2}$
<p>位置参数被称为位置参数的原因是,只有传递的参数的位置才重要。因此,您可以编写任意两个表达式作为<code>print_a_line</code>的参数,无论哪个先传递的参数都将绑定到<code>line_count</code>,在执行<code>print_a_line</code>期间,第二个传递的参数都将绑定到<code>f</code>。在</p>
<p>对于<em>命名参数</em>则不是这样,但是语法是不同的。要传递一个命名参数,可以编写<code>name=expression</code>,而不是简单地写<code>expression</code>。因此,要调用<code>print_a_line_2</code>,可以编写</p>
<pre><code>print_a_line_2(line_count=3, f=current_file)
</code></pre>
<p>参数的名称来自于等号之前的<em>,而不是等号之后的。在</p>
<p>有关命名参数和位置参数的更多信息,我建议您查看<a href="http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions" rel="nofollow">the Python tutorial</a>。在</p>
<p><strong>编辑</strong>:当你打电话给<code>line_count(current_line, current_file)</code>时,引擎盖下会发生什么</p>
<p>Python解释器维护有关程序的若干信息,它维护的一些重要内容包括一个符号表(将名称(变量)绑定到它们的值)和一个当前语句指针。每当当前语句指针到达该行时</p>
<pre><code>print_a_line(current_line, current_file)
</code></pre>
<p>Python解释器在符号表中查找<code>print_a_line</code>、<code>current_line</code>、和{<cd15>}。它发现<code>print_a_line</code>绑定到您在问题中定义的函数,<code>current_line</code>绑定到3,<code>current_file</code>绑定到一个file对象(这是一个大型的实现定义的数据结构,为了便于表示,我将其称为F,大写的F与小写的<code>f</code>我们稍后再见面)。由于<code>print_a_line</code>是一个函数,解释器用参数3和F调用函数。为了完成这一点,解释器保存当前的执行状态,在符号表中将变量{<cd1>}绑定到3,<code>f</code>绑定到F,并将当前语句指针移动到<code>print_a_line</code>函数的第一行,即</p>
<pre><code>print line_count, f.readline()
</code></pre>
<p>然后,它执行内置的<code>print</code>语句的方式与执行原始函数调用的方式大致相同,即在符号表中查找所有变量,并以与对<code>print_a_line</code>的整体函数调用相同的方式调用<code>print</code>。然后,当<code>print_a_line</code>函数返回时,Python解释器将从符号表中删除<code>line_count</code>和{<cd7>},并将语句指针移回之前保存的位置。然后在调用<code>print_a_line</code>之后继续执行代码行。在</p>