【问题标题】:Is there any advantage for returning a value rather than setting global variables? [duplicate]返回值而不是设置全局变量有什么好处吗? [复制]
【发布时间】:2015-03-05 15:21:18
【问题描述】:

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

例如,这里有两个 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 的变量。那么有理由使用第一个示例而不是第二个示例吗?

【问题讨论】:

  • 你应该尽量避免污染全局命名空间。
  • 几行微不足道的代码,很难看出危害,但Global Variables Are Bad
  • 全局变量只有一个实例,意味着不可能递归。例如解析表达式 expr ::= expr op expr for a[0]+function(b+c)/5

标签: python theory


【解决方案1】:

这取决于上下文。但是为什么要声明一个全局变量,然后以这种方式更改它呢?如果您的目标是:“将 1 加到数字 x”,那么第一个要好得多。 还要考虑信息隐藏:

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

有了这个解决方案,作为程序员的你现在正是函数的作用(但不是如何——>这就是信息隐藏的原理)。

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

【讨论】:

    【解决方案2】:

    第一部分有本地代码,这使得它更容易理解。如果我剪掉这个函数并让你看到它——你可能会明白它的作用:

    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
    

    等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2016-04-03
      • 1970-01-01
      相关资源
      最近更新 更多