当我在函数中传递一个完全不同的参数名时会发生什么?

2024-06-17 09:45:39 发布

您现在位置:Python中文网/ 问答频道 /正文

假设函数如下:

def print_a_line(line_count, f):
    print line_count, f.readline()

我称之为:

^{pr2}$

现在发生了什么?行数=3还是行数=3?在

另外,如果我传递不同的参数名(就像我在这里使用current_line而不是line \u count)是不是一件坏事在


Tags: 函数参数readlinedefcountlinecurrentprint
3条回答

你把望远镜搞糊涂了。假设您的文件如下所示:

def print_a_line(line_count, f):
    print line_count, f.readline()

def main():
    current_line = 3
    print_a_line(current_line, current_file)

if __name__ == "__main__":
    current_file = open('file.txt')
    main()

main中,有{},而{}是一个局部变量。方法print_a_line和变量{}是全局的,这就是为什么{}可以使用它们。在print_a_line中,有局部变量line_count和{},它们分别与current_line和{}相同。但是,因为current_linemain的局部,而{}是{}的局部,因此没有一个范围current_line == line_count计算{}。在

这样做绝对不是坏事——相同的值在不同的范围内可能意味着不同的东西,变量的名称应该反映这一点。在

阅读其他人推荐的地方。在定义和调用函数时使用不同的名称并不是一件坏事;事实上,我建议您在充分理解范围和所有这些之前使用它。在

What happens now? line_count = 3 or will it be line_count= current_line = 3?

在对print_a_line的调用中,line_count被绑定到3。变量current_line不受调用的影响。在

Also, is it a bad thing if I pass different argument names(like I did here with current_line instead of line_count?)

这一点都不是坏事。您使用的是位置参数而不是命名参数。在

在Python中,有两种类型的参数:位置参数和命名参数。像上面的print_a_line函数一样声明的函数只使用位置参数。只有命名参数的函数可能看起来像

def print_a_line_2(line_count=3, f=None):
    if f is not None:
        print line_count, f.readline()

同时具有位置参数和命名参数的函数可能看起来像

^{pr2}$

位置参数被称为位置参数的原因是,只有传递的参数的位置才重要。因此,您可以编写任意两个表达式作为print_a_line的参数,无论哪个先传递的参数都将绑定到line_count,在执行print_a_line期间,第二个传递的参数都将绑定到f。在

对于命名参数则不是这样,但是语法是不同的。要传递一个命名参数,可以编写name=expression,而不是简单地写expression。因此,要调用print_a_line_2,可以编写

print_a_line_2(line_count=3, f=current_file)

参数的名称来自于等号之前的,而不是等号之后的。在

有关命名参数和位置参数的更多信息,我建议您查看the Python tutorial。在

编辑:当你打电话给line_count(current_line, current_file)时,引擎盖下会发生什么

Python解释器维护有关程序的若干信息,它维护的一些重要内容包括一个符号表(将名称(变量)绑定到它们的值)和一个当前语句指针。每当当前语句指针到达该行时

print_a_line(current_line, current_file)

Python解释器在符号表中查找print_a_linecurrent_line、和{}。它发现print_a_line绑定到您在问题中定义的函数,current_line绑定到3,current_file绑定到一个file对象(这是一个大型的实现定义的数据结构,为了便于表示,我将其称为F,大写的F与小写的f我们稍后再见面)。由于print_a_line是一个函数,解释器用参数3和F调用函数。为了完成这一点,解释器保存当前的执行状态,在符号表中将变量{}绑定到3,f绑定到F,并将当前语句指针移动到print_a_line函数的第一行,即

print line_count, f.readline()

然后,它执行内置的print语句的方式与执行原始函数调用的方式大致相同,即在符号表中查找所有变量,并以与对print_a_line的整体函数调用相同的方式调用print。然后,当print_a_line函数返回时,Python解释器将从符号表中删除line_count和{},并将语句指针移回之前保存的位置。然后在调用print_a_line之后继续执行代码行。在

相关问题 更多 >