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

Is it better practice to try to pass variables to a function whose names aren't the same as the arguments?

显然,初学者学到的主要内容之一是函数的参数将保留在该函数内,因此您无需担心变量之间的重叠。 (如果他们是私有的。)

为了尝试拥有更好的编码风格以提高可读性和我在自己的代码中的工作,实际上尝试避免将变量传递给与函数中的参数同名的函数是否更好?

例如:

x = 0

def print_out(x_in):
    print x_in

而不是

x = 0

def print_out(x):
    print x

两个都很好。但请注意,对于任何未作为参数传递的变量,函数体都会关闭外部作用域。

x = 0

def foo():
    print(x)

输出为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 可以毫不费力地理解您的意思,阅读代码的人可能会记住这个名为 x。他们可能会混淆他们,或者他们可能会浪费一点时间来弄清楚为什么他们有相同的名字。

无论如何,调用全局 x 可能不是一个好主意。在实践中,全局的 good 名称与参数的好名称发生冲突的情况很少见。对于在另一个函数中定义的函数,在实践中可能会出现该问题:

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 混淆month?在这种情况下它可能没问题,但你必须考虑你的函数在上下文中是否可读,以及未来的更改是否会涉及访问外部变量。