2015-11-02 115 views
-3

我正在Python中編寫蒙特卡羅模擬,我有一些代碼應該複製矩陣中的某些行。當我最初寫它看起來像這樣的代碼:代碼一旦變成函數就停止工作(Python)

newReplicas = [] 

for j in range(len(replicas)): 
    replica = replicas[j] 
    r2 = 0 
    for x in replica: 
     r2 += x * x 
     V = 0.5 * mass * w**2 * r2 
     W = exp(-(V - ER)/rootT) 
     mn = int(W + random.uniform(0,1)) 
     if mn >= 3: 
      newReplicas.append(replica) 
      newReplicas.append(replica) 
      newReplicas.append(replica) 
     elif mn == 2:  
      newReplicas.append(replica) 
      newReplicas.append(replica) 
     elif mn == 1: 
      newReplicas.append(replica) 
replicas = newReplicas 

這工作絕對沒問題,但是當我在此函數,它停止工作完全沒有行永遠得到複製。這是後我試圖將其轉換爲一個函數的代碼:

def branch(replicas): 
    newReplicas = [] 
    for j in range(len(replicas)): 
     replica = replicas[j] 
     r2 = 0 
     for x in replica: 
      r2 += x * x 
     V = 0.5 * mass * w**2 * r2 
     W = exp(-(V - ER)/rootT) 
     mn = int(W + random.uniform(0,1)) 
     if mn >= 3: 
      newReplicas.append(replica) 
      newReplicas.append(replica) 
      newReplicas.append(replica) 
     elif mn == 2:  
      newReplicas.append(replica) 
      newReplicas.append(replica) 
     elif mn == 1: 
      newReplicas.append(replica) 
    replicas = newReplicas 

branch(replicas) 

print(replicas) 

,我一直在使用的值如下:

mass = 1 
w = 1 
ER = 0.5 
rootT = sqrt(0.02) 

爲什麼會出現這種情況,我該如何解決?

+0

你是什麼意思,它停止工作?你期望它做什麼?這是什麼做錯了? –

+0

'replicas = newReplicas'此行刪除對原始列表的引用,並將'replicas'設置爲指向您的'newReplicas'變量。相反,在函數的末尾有一個'return newReplicas',並在你的代碼中有一行像'replicas = branc(replicas)'一樣改變 –

回答

1

你需要回到你的副本在函數內部和調用函數

def branch(replicas): 
    # code here 
    return new_replicas 

然後在其他地方調用它

print branch(replicas) 

函數可以做任何你想要的事情,但要實際執行您必須通過鍵入該名稱來調用該函數的代碼(在您的案例中爲branch,然後添加括號以調用該函數。因爲你的函數需要一個參數,你必須通過無論他們是在你的函數調用又名branch(replicas)

,如果你想執行該功能後,使用這些副本然後分配給他們

new_replicas = branch(replicas) 
+0

您還需要爲結果指定一個變量,即'x = branch(replicas)' –

+0

@JohnGordon是的,如果OP想要在轉換它們之後使用這些新的副本進行某些操作。 –

0

您需要實際調用該函數,以便它運行:

branch(something) 
+0

我在說的是,當我在我的矩陣上調用函數時,它不會對矩陣不做任何事情。然而,第一塊代碼複製矩陣的隨機行。我在這兩者之間唯一改變的是將代碼定義爲函數,然後在我的矩陣上調用它(儘管我沒有在我的帖子中顯示函數的調用)。 – Hazwell

0

函數變量必須返回或打印某些內容或爲全局變量賦值。否則,沒有意義使用它。其次,你必須在函數本身之外的地方調用它。

def fucn1(): 
    .. 
    return variable 

def fucn2(): 
    .. 
    print variable 

def fucn3(v): 
    global value 
    .. 
    value = variable 

print func1() 
func2() 
func3(v1)