2016-02-05 24 views
0

如果我在Python 2.7中運行以下代碼,我會爲a和b打印[2.,2.,2.]。爲什麼b和a一起變化?非常感謝!如何在Python函數中傳遞變量?

def test_f(x): 
    a = np.zeros(3) 
    b = a 
    for i in range(3): 
     a[i] += x 
    print a 
    print b 
    return 0 

test_f(2) 
+0

,因爲a和b指向同一個內存位置拿着名單 – danidee

回答

6

因爲ba指的是內存中的同一個列表。 b = a不會創建a的新副本。 試試這個,看到了差距:

def test_f(x): 
    a = np.zeros(3) 
    b = a.copy() 
    for i in range(3): 
     a[i] += x 
    print a 
    print b 
    return 0 

test_f(2) 

b = a.copy()將創建一個新的複製恰好類似的a的元素,而b=a只是創建了一個新的引用等植物學列表。

+1

我覺得可讀性''B = a.copy() ''或''b = np.array(a,copy = True)''會更好,因爲你明確提到了複製。 – MSeifert

+2

另外,括號內只需要一個冒號。 – zondo

+1

我同意@MSeifert;而且'[::]'只需要一個冒號 – cat

2

numpy的會使用指針來複制,除非你告訴它,否則:

import numpy as np 

def test_f(x): 
    a = np.zeros(3) 
    b = np.copy(a) 
    for i in range(3): 
     a[i] += x 
    print a 
    print b 
    return 0 

test_f(2) 

[ 2. 2. 2.] 
[ 0. 0. 0.] 
+0

謝謝,基思!這是一個非常明確的解釋! – nusjjsun