2017-01-16 73 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)。根據全球狀況,代碼太難難以理解,並很快導致相當不可預知的行爲。當這個全局狀態在與代碼相同的模塊中被定義時,這已經是真實的,並且當您根據其他模塊對模塊進行明確定義時,所有模塊都將被關閉。另外有能力「注入」函數的依賴關係不僅使得更好的可讀性和可預測性,而且使單元測試更容易。