在python的外部函数中使用全局变量类似于Matlab

在python的外部函数中使用全局变量类似于Matlab,python,Python,在Matlab中,我可以编写一个程序,调用保存到外部文件中的子函数。在这个子函数中,我可以使用变量,而无需在本地声明它们,只要它们以前是全局定义的。在python中也可能出现这种行为吗 例如,子函数应该绘制一些内容。目前,我正在将numpy(np)和matplotlib(plt)作为参数传递给该函数 def plot_weights(weights,session,np,plt): ... 上面的例子来自tensorflow教程,因此session代表tensorflow会话 可以这样

在Matlab中,我可以编写一个程序,调用保存到外部文件中的子函数。在这个子函数中,我可以使用变量,而无需在本地声明它们,只要它们以前是全局定义的。在python中也可能出现这种行为吗

例如,子函数应该绘制一些内容。目前,我正在将numpy(np)和matplotlib(plt)作为参数传递给该函数

def plot_weights(weights,session,np,plt):
    ...
上面的例子来自tensorflow教程,因此
session
代表tensorflow会话

可以这样定义一个函数吗

def plot_weights(weights):
    ...

让python将会话、np、plt作为一些全局变量?

我认为最好不要在python中走这条路。 您可以在另一个模块中定义
session
(称为m),然后必须始终将其称为m.session,而不是从m import session中定义


我相信使用函数来检索全局状态是更好的方法,但是完全避免全局状态是最好的。

第一点是,在Python中,“全局”名称对于模块来说是全局的——没有“真实的”进程级全局名称空间。因此,不可能出现这样的情况:模块a设置一对全局变量,从模块B导入一个函数,模块B自动看到模块a的全局变量(好吧……至少不能不使用非常肮脏的技巧)

第二点是它实际上是一件好事(tm)。依赖于全局状态会使代码更难理解,并很快导致相当不可预测的行为。当此全局状态与依赖于它的代码在同一个模块中定义时,以及当您启动依赖于其他模块的模块并正确定义流程全局名称时,所有赌注都已关闭时,这种情况已经存在


此外,能够“注入”函数的依赖项不仅可以提高可读性和可预测性,还可以使单元测试更容易

你在寻找类似的东西吗?你在鼓吹名称空间污染。当您尝试通过添加更多模块来扩展此功能时,会出现名称冲突(多个模块使用相同的名称)。您必须跟踪每个模块中使用的所有名称,并且模块作者不能更改任何内容。您必须小心,不要在自己的代码中使用这些名称。支持变成了一场噩梦,因为你不知道谁改变了什么,什么时候改变了什么。根据下面给出的答案,
global
并不意味着跨模块的全局,因此我似乎无法真正绕过将所有对象作为函数参数传递的问题。对于numpy和matplotlib,我假设我至少可以将它们导入子函数本身,而不是将它们作为参数传递?这听起来像是模块的重新加载将是缓慢的,但是。。。