2024-09-27 17:50:57 发布
网友
假设函数如下:
def print_a_line(line_count, f): print line_count, f.readline()
我称之为:
现在发生了什么?行数=3还是行数=3?在
另外,如果我传递不同的参数名(就像我在这里使用current_line而不是line \u count)是不是一件坏事在
你把望远镜搞糊涂了。假设您的文件如下所示:
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_line是main的局部,而{}是{}的局部,因此没有一个范围current_line == line_count计算{}。在
main
print_a_line
line_count
current_line
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()
同时具有位置参数和命名参数的函数可能看起来像
位置参数被称为位置参数的原因是,只有传递的参数的位置才重要。因此,您可以编写任意两个表达式作为print_a_line的参数,无论哪个先传递的参数都将绑定到line_count,在执行print_a_line期间,第二个传递的参数都将绑定到f。在
f
对于命名参数则不是这样,但是语法是不同的。要传递一个命名参数,可以编写name=expression,而不是简单地写expression。因此,要调用print_a_line_2,可以编写
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)时,引擎盖下会发生什么
line_count(current_line, current_file)
Python解释器维护有关程序的若干信息,它维护的一些重要内容包括一个符号表(将名称(变量)绑定到它们的值)和一个当前语句指针。每当当前语句指针到达该行时
print_a_line(current_line, current_file)
Python解释器在符号表中查找print_a_line、current_line、和{}。它发现print_a_line绑定到您在问题中定义的函数,current_line绑定到3,current_file绑定到一个file对象(这是一个大型的实现定义的数据结构,为了便于表示,我将其称为F,大写的F与小写的f我们稍后再见面)。由于print_a_line是一个函数,解释器用参数3和F调用函数。为了完成这一点,解释器保存当前的执行状态,在符号表中将变量{}绑定到3,f绑定到F,并将当前语句指针移动到print_a_line函数的第一行,即
current_file
print line_count, f.readline()
然后,它执行内置的print语句的方式与执行原始函数调用的方式大致相同,即在符号表中查找所有变量,并以与对print_a_line的整体函数调用相同的方式调用print。然后,当print_a_line函数返回时,Python解释器将从符号表中删除line_count和{},并将语句指针移回之前保存的位置。然后在调用print_a_line之后继续执行代码行。在
print
你把望远镜搞糊涂了。假设您的文件如下所示:
在},而{}是一个局部变量。方法}是全局的,这就是为什么{}可以使用它们。在},它们分别与}相同。但是,因为}是{}的局部,因此没有一个范围}。在
main
中,有{print_a_line
和变量{print_a_line
中,有局部变量line_count
和{current_line
和{current_line
是main
的局部,而{current_line == line_count
计算{这样做绝对不是坏事——相同的值在不同的范围内可能意味着不同的东西,变量的名称应该反映这一点。在
阅读其他人推荐的地方。在定义和调用函数时使用不同的名称并不是一件坏事;事实上,我建议您在充分理解范围和所有这些之前使用它。在
在对
print_a_line
的调用中,line_count
被绑定到3。变量current_line
不受调用的影响。在这一点都不是坏事。您使用的是位置参数而不是命名参数。在
在Python中,有两种类型的参数:位置参数和命名参数。像上面的
print_a_line
函数一样声明的函数只使用位置参数。只有命名参数的函数可能看起来像同时具有位置参数和命名参数的函数可能看起来像
^{pr2}$位置参数被称为位置参数的原因是,只有传递的参数的位置才重要。因此,您可以编写任意两个表达式作为
print_a_line
的参数,无论哪个先传递的参数都将绑定到line_count
,在执行print_a_line
期间,第二个传递的参数都将绑定到f
。在对于命名参数则不是这样,但是语法是不同的。要传递一个命名参数,可以编写
name=expression
,而不是简单地写expression
。因此,要调用print_a_line_2
,可以编写参数的名称来自于等号之前的,而不是等号之后的。在
有关命名参数和位置参数的更多信息,我建议您查看the Python tutorial。在
编辑:当你打电话给
line_count(current_line, current_file)
时,引擎盖下会发生什么Python解释器维护有关程序的若干信息,它维护的一些重要内容包括一个符号表(将名称(变量)绑定到它们的值)和一个当前语句指针。每当当前语句指针到达该行时
Python解释器在符号表中查找}。它发现}绑定到3,
print_a_line
、current_line
、和{print_a_line
绑定到您在问题中定义的函数,current_line
绑定到3,current_file
绑定到一个file对象(这是一个大型的实现定义的数据结构,为了便于表示,我将其称为F,大写的F与小写的f
我们稍后再见面)。由于print_a_line
是一个函数,解释器用参数3和F调用函数。为了完成这一点,解释器保存当前的执行状态,在符号表中将变量{f
绑定到F,并将当前语句指针移动到print_a_line
函数的第一行,即然后,它执行内置的},并将语句指针移回之前保存的位置。然后在调用
print
语句的方式与执行原始函数调用的方式大致相同,即在符号表中查找所有变量,并以与对print_a_line
的整体函数调用相同的方式调用print
。然后,当print_a_line
函数返回时,Python解释器将从符号表中删除line_count
和{print_a_line
之后继续执行代码行。在相关问题 更多 >
编程相关推荐