返回值而不是设置全局变量有什么好处吗?

时间:2015-01-07 16:51:23

标签: python theory

我没有看到使用函数返回值和仅在函数内操作全局变量之间的区别。我读过的大多数指南和书籍似乎都鼓励使用前者而不是后者。

例如,这里有两个Python代码块(据我所知)做同样的事情:

someVariable = first_function(5)
def first_function (foo):
    bar = foo + 1
    return(bar)

anotherVariable = 0
second_function(5)
second_function (foo):
    global anotherVariable
    anotherVariable = foo + 1

当然,第一个例子看起来更干净,更简洁,但两者都得到了相同的结果;他们获得了一个值为6的变量。那么有理由在第二个例子中使用第一个例子吗?

2 个答案:

答案 0 :(得分:1)

这取决于具体情况。但是,为什么要声明一个全局变量然后以这种方式更改它?如果你的目标是:'将数字1加1',那么第一个就更好了。 还要考虑隐藏信息:

def addOne(foo):
    return (foo+1)

使用这个解决方案,你现在作为一个程序员正是这个函数的功能(但不是如何 - >这是信息隐藏的原理)。

在第二个例子中,它完全不清楚,你必须首先定义一个变量(具有特定的名称),然后执行方法。我没有看到第二个变种的目的。

答案 1 :(得分:1)

第一部分有本地代码,这使更容易理解。如果我削减了功能并让你看到它 - 你可能会理解它的作用:

def add_one(foo):
    bar = foo + 1
    return(bar)

它也是泛型,因为我可以将它应用于一系列值,这样可以保留代码DRY

map(add_one, range(10))

第二部分具体anothervariable。这会创建一个类似于对象的行为,其中函数会影响状态变量(在本例中为anothervariable)。此外,anothervariable是在函数范围之外定义的,这使得阅读/理解更加困难。

当你遇到这样的代码时,你可能应该有一个类,捕获anothervariable的状态并操纵它。或者,您可以使用通用函数来执行所需操作,而不必依赖于其他位置定义的特定变量。

如果你想为另一个变量实现相同的行为,你必须编写两次相同的代码,这就失去了首先使用函数的目的!

你最终会得到:

assign_x_plus_1_to_anothervariable(foo):
    global anotherVariable
    anotherVariable = foo + 1

assign_x_plus_1_to_anothervariable2(foo):
    global anotherVariable2
    anotherVariable2 = foo + 1

assign_x_plus_1_to_anothervariable3(foo):
    global anotherVariable3
    anotherVariable3 = foo + 1

等等......