2014-12-04 69 views
2

後陣列值。如果我這樣寫:記住函數調用

c = [] 

def cf(n): 
    c = range (5) 
    print c 
    if any((i>3) for i in c) is True: 
     print 'hello' 

cf(1) 

print c 

然後我得到:

[1, 2, 3, 4] 
hello 
[] 

我真的很新的節目,所以請真正簡單的解釋,但怎麼辦我停止Python忘記函數結束後什麼是c?我認爲我可以通過在函數前定義c來修復它,但顯然c與僅爲函數循環創建的不同。

在我的例子,我可以明明只是寫:

c = range (5) 
def cf(n) 

但我試圖寫的程序更像是這樣的:

b = [blah] 
c = [] 
def cf(n): 
    c = [transformation of b] 
    if (blah) is True: 
     'loop' cf 
    else: 
cf(1) 
g = [transformation of c that produces errors if c is empty or if c = b] 

所以我不能確定外c功能。

+1

放'全球C'在你的函數的頂部,它會使用在你f的頂層中定義的版本ile,而不是在函數內部創建一個新的變量。 – 2014-12-04 23:36:31

+1

'全球c'在'cf'中使用此 – Marcin 2014-12-04 23:37:17

+0

真棒,歡呼! – Patrik333 2014-12-04 23:43:21

回答

4

在Python中,你可以在閱讀功能全局變量,但你不能默認分配給他們。原因是每當python發現c =它會創建一個局部變量。因此,要分配給全局變量,您需要明確指定您正在分配給全局變量。

那麼這將工作,如:

c = [1,2,3] 

def cf(): 
    print(c) # it prints [1,2,3], it reads global c 

然而,這並不能如你所願:

c = [1,2,3] 

def cf(): 
    c = 1 # c is local here. 
    print(c) # it prints 1 


cf() 
print(c) # it prints [1,2,3], as its value not changed inside cf() 

因此,爲了使C是一樣的,你需要:

c = [1,2,3] 

def cf(): 
    global c 
    c = 1 # c is global here. it overwrites [1,2,3] 
    print(c) # prints 1 


cf() 
print(c) # prints 1. c value was changed inside cf() 
+0

太棒了,這正是我想要的!我點擊upvote,但我需要15代表...我會點擊'回答',但顯然我必須等待2分鐘。但是,是的,這很好,謝謝。 – Patrik333 2014-12-04 23:48:23

+0

@ Patrik333謝謝。很高興我能爲你澄清這個問題。 – Marcin 2014-12-04 23:50:23

+0

我其實現在還有其他相關問題 - 我想我應該發一個新帖子? – Patrik333 2014-12-04 23:57:09

1

試試這個

c = [] 

def cf(n): 
    global c 
    c = range (5) 
    print c 
    if any((i>3) for i in c) is True: 
    print 'hello' 

cf(1) 

print c 
1

如果你想讓你的函數修改c然後使其明確,即你的函數應該返回新值的c。這樣可以避免不必要的副作用:

def cf(n, b): 
    """Given b loops n times ... 

    Returns 
    ------ 
    c: The modified value 
    """ 
    c = [transformation of b] 
    ... 
    return c # <<<<------- This 

c = cf(1) 
2

您也可以在聲明它之後將數組c傳遞到函數中。由於數組是一個函數參數,只要我們不使用=語句,傳入的c將被修改。這樣就可以實現這樣的:

def cf(n, c): 
    c.extend(range(5)) 
    print c 
    if any((i>3) for i in c) is True: 
    print 'hello' 

if __name__ == '__main__': 
    c = [] 
    cf(1, c) 
    print c 

有關此方法的說明,請參見this

這是最好引入全局變量到你的代碼(這通常被認爲是不好的做法)。ref

2

總結了幾個回答這些問題,你有3個基本選項:

  1. 變量聲明爲全局在你的函數
  2. 返回變量在年底本地實例的頂部你的函數
  3. 傳遞變量作爲參數傳遞給你的函數