当前位置: 首页 > 知识库问答 >
问题:

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

郎星汉
2023-03-14

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

例如,这里有两个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个答案

富涛
2023-03-14

第一部分有本地代码,这使得它更容易理解。如果我剪切函数并让您看到它,您可能会理解它的功能:

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

它也是通用的,因为我可以将其应用于一个范围的值,这将保持代码干燥:

map(add_one, range(10))

第二部分特定于另一个变量。这会创建一种类似对象的行为,其中函数会影响一个状态变量(在本例中为另一个变量)。另外,另一个变量在函数的作用域之外定义,这使得它更难读取/理解。

当您遇到这样的代码时,您可能应该使用一个类来代替它,捕获另一个变量的状态并对其进行操作。或者,您可以使用一个通用函数来执行您需要的操作,而不依赖于在别处定义的特定变量。

如果您想为另一个变量实现相同的行为,那么您必须编写两次相同的代码,这就违背了最初使用函数的目的!

你最终会得到:

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

等等...

冉绯辞
2023-03-14

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

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

有了这个解决方案,作为程序员,你现在确切地知道这个函数是做什么的(但不是如何-

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

 类似资料:
  • 问题内容: 为什么全局变量是不好的?[closed] 问题答案: 这与Python无关。全局变量在任何编程语言中都是不好的。 但是,全局常量在概念上与全局变量并不相同。全局常数完全无害。只是在Python中没有强制性差异,只有约定是。 它们不好的原因是它们使函数具有隐藏的(非显而易见的,令人惊讶的,难以检测的)副作用,从而导致复杂性的增加,并有可能导致产生Spaghetti代码。 但是,即使在函数

  • 我正在尝试学习C,特别是如何声明和初始化变量。我写了这段代码,我不知道为什么变量c给出了一个我还没有分配的值。 输出是-2,但我没有状态c=-2任何地方!

  • 问题内容: 全局变量在Python中如何工作?我知道全局变量是有害的,我只是在做实验。 这在python中不起作用: 我收到一个错误: 我究竟做错了什么? 问题答案: 您需要声明: 在Python中, 您分配的 变量默认情况下成为局部变量。您需要使用将它们声明为全局变量。另一方面,您 引用但未分配的 变量不会自动成为局部变量。这些变量指的是封闭范围内最接近的变量。 Python 3.x引入了类似于

  • 我使用的是swing,有一个函数(CreateAndShowGUI())可以监听上、左、右键的按下 现在,当我运行程序并按下任意键(向上、向左、向右、向下)时,我可以看到按下的键变量被设置为True。但当我试图在main中访问相同的内容时,按下的这个键的值为false。谁能帮我找出我错的地方吗?

  • 问题内容: 我试图在量角器上设置一个全局变量,以在所有描述块中使用。 但这返回了以下错误: 我也看了这个问题:量角器angularJS全局变量 所以我试图以这种方式在conf.js中设置变量glob: 仍然有相同的错误。 如何在量角器测试中正确添加全局变量? 问题答案: 可以借助属性从量角器配置文件设置全局变量: 您可以使用规范中访问它。 请参阅参考配置文件。 params对象将直接传递到Prot

  • 本文向大家介绍static全局变量与普通的全局变量有什么区别?相关面试题,主要包含被问及static全局变量与普通的全局变量有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 static全局变量只初使化一次,防止在其他文件单元中被引用; 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式