2010-10-29 44 views
1

我用瓦爾()函數的第一次,並且注意到了這個現象:如何從函數返回本地變量([object])?

nodes = ['one', 'two', 'three'] 

for node in nodes: 
    vars()[node + '_'] = 'some calc ' + node 
    vars()[node] = vars()[node + '_'] 

print one 

隨着預期這個片段的Python輸出some calc one,但如果我用這裏面的功能是這樣的:

def main(): 

    nodes = ['one', 'two', 'three'] 

    for node in nodes: 
     vars()[node + '_'] = 'some calc ' + node 
     vars()[node] = vars()[node + '_'] 

    print one 

main() 

它輸出NameError: global name 'one' is not defined

VARS()對象是字典:

{'node': 'three', 'three_': 'some calc three', 'two': 'some calc two', 'one': 'some calc one', 'two_': 'some calc two', 'three': 'some calc three', 'nodes': ['one', 'two', 'three'], 'one_': 'some calc one'} 

現在,我想知道這是怎麼回事,因爲這功能是不是有據可查的,我無法找到例子,說明如果內部函數返回的變量

+0

我剛剛聲明瞭新的dict變量,並將值從vars()分配到:d [node] = vars()[node];返回d – romor 2010-10-30 03:12:42

回答

0

vars()的作用就像locals()如果調用無參數,所以從the docs

注意:本詞典的內容不應修改;更改可能不會影響解釋器使用的本地變量和自由變量的值。

2

,它工作在一個模塊的「全局」範圍內調用時,其原因是,它相當於globals()在這方面實際上是由蟒蛇存儲的字典。非全局範圍的本地實際上並不是實現中的字典(這是爲了避免在訪問它們時不得不查找字典鍵),因此沒有真正的字典可以返回。相反,Python爲你創造了一個,但它並沒有以任何方式連接到真正的本地變量數組。我知道將新本地人插入到執行框架中的唯一方法是使用execeval,但幾乎總是有一種更好的方式來執行您所需的操作,而不需要動態地創建本地人。

如果您想在非執行框架中創建局部變形,那麼您可以將字節代碼轉換應用於其中,例如,將全局變成局部變量,單元格或常量,但這是一些不重要的黑魔法,並且再次,幾乎肯定有更好的方法。

你的問題引用了返回的東西,但我沒有看到任何你正在返回的東西。你想要返回什麼?

我想說,你給你的返回值的名稱應該有非常小的影響,因爲這不是他們將在調用框架中給出的名稱。爲什麼沒有一個簡單的字典就足夠了?

+0

感謝您的解釋。我想以這種方式保留名稱,因爲它們將代碼簡化爲我有限的Python知識。我試圖解析我在xml_data變量中的Google書籍響應(即鏈接:​​http://www.google.com/books/feeds/volumes/g__6DX33JWUC),並將其傳遞給其他處理。這裏是那個函數 - (鏈接:http://codepad.org/ne4jZQ3k)當然我可以擴展代碼,但這種方法對我來說看起來很好 – romor 2010-10-29 14:07:36

+0

PS:如果不是很明顯我使用lxml – romor 2010-10-29 14:22:39