2017-04-02 155 views
0

我很難理解爲什麼我的代碼的工作方式。現在,我正在初始化一個全局變量,我將它設置爲0,所以如果我將它打印到我的函數之外的任何地方,我應該得到0.Python全局與局部變量?

當我在函數內打印i時, 12次調用該函數兩次後。我認爲這是因爲全球我是0,但一些本地我變量不是。但是,當我用i作爲參數調用reach_load時,是不是傳入i(0)的全局值?

import sys 

d = {} 
size_0 = sys.getsizeof(d) 
i = 0 

def reach_load(d, size_0, i): 
    size_0 = sys.getsizeof(d) 
    while size_0 == sys.getsizeof(d): 
     d[i] = i 
     i += 1 
    print(i) 

reach_load(d, size_0, i) 
reach_load(d, size_0, i) 
+1

「然而,當我打電話跟我reach_load作爲參數,又不是我傳遞我的全局值(0)?」 - 是的,但是當你分配給它時,你並沒有分配給全局。請參閱https://nedbatchelder.com/text/names.html – user2357112

回答

1

i這裏是一個純粹的局部變量。它沒有鏈接到同名的全局變量;你稱它爲同一事物的事實沒有任何區別。

+0

當我第二次調用reach_load函數時,我傳入的不是0嗎? – gridproquo

+0

是的,因爲你沒有修改全局。 –

0

我想你已經在這裏混淆了兩件事:全球i不會改變,但d確實(因爲它是可變的)。每次撥打reach_load時,i開始爲0,但由於字典較大,while循環將運行更長,因此將打印更高的數字。

0

因爲i參數reach_load是一個正式的參數是本地的功能。這是一個具有相同標籤的局部變量。如果你真的想增加全球的話,那麼把global i放在這個函數的頂部。但是,這被認爲是糟糕的設計。如果您需要保留一些狀態,請使用class定義一個新對象以保留它。

0

當您在第10行d[i]處的函數中調用i時,首先使用的Python解釋器檢查本地作用域中的該變量。如果它沒有找到它,它會檢查下一個作用域,在你的情況下恰好是全局作用域。此時,您正在調用全局變量。

但是,只要您做了i += 1i就會成爲局部變量,因爲它現在已在本地範圍內定義。

我不是100%,你希望發生什麼,雖然。你想知道爲什麼函數的第二次運行返回不同的結果嗎? 如果是這樣,我相信你的問題在於你size_0變量

全局定義size_0,但在函數開始時,在本地重新定義它,這是您的函數最終使用的定義,而全局的size_0最終不會被使用。如果你想刪除:

從你的函數,每次運行會產生相同的結果。

真正有助於弄清楚這些問題是添加各種代碼,幫助你跟蹤你的代碼的執行。在本例中,您可以在臨界點添加一堆print()語句,如print(d, size_0) # inside and outside the function

這是很難給出了建議,因爲它不是很清楚,我什麼代碼應該完成的任務。