gpt4 book ai didi

Python;为什么传递函数参数不是强制性的

转载 作者:行者123 更新时间:2023-11-28 22:17:55 25 4
gpt4 key购买 nike

在我看来,将要在函数内部使用的变量传递给 python 中的该函数并不是强制性的。

这段代码:

def functionWithoutArgs():
print(theList)
theList.append('asdf')
print(theList)
theNewList = theList + ['qwer']
print(theNewList)
return theNewList

theList = ['this', 'is', 'a', 'list']
theLastList = functionWithoutArgs()
print(theLastList)

给我这个输出(没有错误或警告):

['this', 'is', 'a', 'list']
['this', 'is', 'a', 'list', 'asdf']
['this', 'is', 'a', 'list', 'asdf', 'qwer']
['this', 'is', 'a', 'list', 'asdf', 'qwer']

令我惊讶的是没有出现异常。这是因为(在我看来)允许函数使用未传递给它们的变量会严重混淆该函数与其他代码的交互方式。
据我了解,函数的全部意义在于将程序分解成小部分,这些小部分与其余代码的交互明确定义。

问题:
为什么 python 允许在函数内部使用尚未传递给该函数的变量?

附加信息:
示例中代码过多的原因是这个线程 Use a Variable in a Function Without Passing as an Argument其中接受的答案声称只有当被调用函数不修改或重命名变量(至少我理解)时才允许使用未传递的变量,上面的代码反例。

我知道这个问题是边缘主观的或基于意见的,因为它是一个“为什么……”的问题,但我觉得这是一个非常基本的问题,因此必须就此达成某种共识。此外,对于许多新的 Python 程序员来说,这将是有用的知识。

最佳答案

完整的答案需要深入解释整个语言的工作原理,这已经记录在案 - the official doc about scoping and namespaces可能是这里最好的起点。

长话短说,在 Python 中一切都是对象——包括函数、类和模块——函数、模块和类没有不同的命名空间。 IOW,在以下代码中:

FOO_FACTOR = 2

def foo(arg):
return bar(arg) * FOO_FACTOR

def bar(arg):
return arg + 3

foo中,bar实际上是一个全局变量,就像FOO_FACTOR一样。如果不允许函数访问全局范围内的名称,则必须显式传递 barFOO_FACTOR,如果需要特殊声明来访问全局变量,则每次一个函数使用另一个函数、类或模块时都必须编写大量样板代码,至少可以说这是非常不切实际的。

allowing functions to use variables that have not been passed to them obfuscates how that function interacts with other code pretty severely.

好吧,重新绑定(bind)(或者甚至只是改变)非本地名称确实会导致很多问题——wrt/可读性(推理代码的能力)、可测试性等,还有 wrt/并发性和 reentrancy , 应尽可能避免。

但是从实际的 POV 来看,你很难避免至少“只读”全局变量(符号常量、其他函数、类、模块等),有时你还需要至少一个几个确实会改变/重新绑定(bind)全局名称的函数(例如考虑应用程序设置)——这里的要点是这些函数应该只在应用程序启动时调用来定义你的符号常量等。

关于Python;为什么传递函数参数不是强制性的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com