【发布时间】:2018-11-29 08:46:40
【问题描述】:
在我看来,将要在函数中使用的变量传递给 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程序员来说,这将是有用的知识。
【问题讨论】:
-
"...不修改...变量"。我认为您误解了链接的答案。列表是可变的,因此更改它们不会导致它们重新绑定到名称,它仍然是同一个对象。如果你试图增加一个全局整数(不可变),没有
global,那么它会抛出一个错误。 -
全局变量的要点是它们在模块范围内(几乎)可以访问,这有时很有用,而不是 Python 的独特功能,例如 R 类似
-
全局变量是一种广泛使用的结构。在您的情况下,使用一个没有令人信服的需要。我发现这个期望有点值得商榷,这应该由 Python 解释器(或任何其他动态语言)检测到。对于这种严格性,其他语言更适合。
-
您可能需要重新阅读Python Scopes and Namespaces 了解更多背景信息。