2015-11-02 113 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)