2017-01-16 67 views
-1

在Matlab中,我可以编写一个程序调用保存到外部文件的子函数。在那个子函数中,我可以使用变量而不用在本地声明它们,只要它们已经在全局之前被定义。 python中的这种行为也可能吗?在类似于Matlab的Python中使用外部函数中的全局变量

一个例子是一个应该绘制一些东西的子函数。目前我路过numpy的(NP)和matplotlib(PLT)作为参数传递给该函数

def plot_weights(weights,session,np,plt): 
    ... 

上面的例子来自tensorflow教程,所以session代表一个tensorflow会话。

是否可以这样定义

def plot_weights(weights): 
    ... 

的功能,使蟒蛇采取sessionnpplt一些全局变量?

+0

您是否在寻找类似['global']的东西(http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated -他们)? – 2017-01-16 09:50:28

+0

您正在倡导*命名空间污染*。当您尝试通过添加更多模块来扩展这个问题并且遇到名称冲突(使用相同名称的多个模块)时,问题就出现了。您必须跟踪每个模块中使用的所有名称,并且模块作者无法更改任何内容。你必须小心,不要在你自己的代码中使用这些名字。支持变成了一场噩梦,因为你不知道谁改变了什么,什么时候改变。它也杀死小猫。 – cdarke

+0

根据下面给出的答案,'global'并不意味着整个模块都是全局的,所以我似乎无法真正绕过所有对象作为函数参数。在numpy和matplotlib的情况下,我认为我至少可以将它们导入到子函数本身中,而不是将它们作为参数传递给它们?这听起来像这个重装模块会很慢,但... – mcExchange

回答

3

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

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

2

第一点是在Python中,“全局”名称仅对模块是全局名称 - 没有“真正的”,进程级别的全局名称空间。所以不,你不能有一个场景,其中模块A设置了一对全局变量,从模块B导入一个函数,而模块B自动地看到模块A的全局变量(好吧......至少不是诉诸非常非常肮脏的技巧)。

第二点是它实际上是一个GoodThing(tm)。根据全球状况,代码太难难以理解,并很快导致相当不可预知的行为。当这个全局状态在与代码相同的模块中被定义时,这已经是真实的,并且当您根据其他模块对模块进行明确定义时,所有模块都将被关闭。另外有能力“注入”函数的依赖关系不仅使得更好的可读性和可预测性,而且使单元测试更容易。