尝试将变量传递给名称与参数相同的函数是否是更好的做法?

时间:2015-03-10 11:20:02

标签: python function arguments

显然,初学者学习的主要内容之一是函数的参数将保持在该函数内,因此您不必担心变量之间的重叠。 (如果他们是私人的。)

为了获得更好的编码风格以帮助我在自己的代码中实现可读性和工作,实际上是否最好避免将变量传递给与函数中的参数同名的函数?

例如:

x = 0

def print_out(x_in):
    print x_in

而不是

x = 0

def print_out(x):
    print x

2 个答案:

答案 0 :(得分:0)

两者都很好。但请注意,对于未作为参数传递的任何变量,函数体将关闭外部范围。

x = 0

def foo():
    print(x)

输出为0

这是一件好事,但必须牢记在心。

答案 1 :(得分:0)

这很常见。例如:

def do_one_day(year, month, day):
    print datetime.date(year, month, day)

def do_the_whole_month(year, month):
    for day in xrange(1, 32): # bug, but you get the idea
        do_one_day(year, month, day)

每个变量在其上下文中应该具有最佳名称:在这种情况下,在两个函数中调用年year是有意义的,并且我们不会因为一个函数调用另一个函数而改变它

在您的示例中,x不仅仅是传递给print_out的参数的名称,它实际上位于定义print_out的同一范围内。由于print_out可以直接按名称访问x,因此通常会更清楚地为参数指定不同的名称,以免隐藏外部x。即使您无意在函数中使用外部x,即使Python不会理解您的意思,阅读代码的人可能会想到这个全局调用{ {1}}。他们可能会混淆他们,或者他们可能会浪费一些时间来弄清楚为什么他们有相同的名字。

无论如何,调用全局x可能是一个坏主意。在实践中,对于具有参数的良好名称的全局冲突,良好的名称是非常罕见的。在实践中,可能会出现另一个函数中定义的函数的问题:

x

撇开我们是否真的应该def do_the_next_year(year, month): def increment(year, month): month += 1 if month == 13: month = 1 year += 1 return year, month for _ in xrange(12): year, month = increment(year, month) do_the_whole_month(year, month) 内部功能,我们问自己,increment是否应该为其参数使用不同的名称,以避免与外部increment和{year混淆{1}}?在这种情况下,它可能没问题,但您必须考虑您的函数在上下文中是否可读,以及将来的更改是否涉及访问外部变量。

相关问题