代码一旦变成函数就停止工作(Python)
我正在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)
为什么会出现这种情况,我该如何解决?
你需要回到你的副本在函数内部和调用函数
def branch(replicas):
# code here
return new_replicas
然后在其他地方调用它
print branch(replicas)
函数可以做任何你想要的事情,但要实际执行您必须通过键入该名称来调用该函数的代码(在您的案例中为branch
,然后添加括号以调用该函数。因为你的函数需要一个参数,你必须通过无论他们是在你的函数调用又名branch(replicas)
,如果你想执行该功能后,使用这些副本然后分配给他们
new_replicas = branch(replicas)
您还需要为结果指定一个变量,即'x = branch(replicas)' –
@JohnGordon是的,如果OP想要在转换它们之后使用这些新的副本进行某些操作。 –
您需要实际调用该函数,以便它运行:
branch(something)
我在说的是,当我在我的矩阵上调用函数时,它不会对矩阵不做任何事情。然而,第一块代码复制矩阵的随机行。我在这两者之间唯一改变的是将代码定义为函数,然后在我的矩阵上调用它(尽管我没有在我的帖子中显示函数的调用)。 – Hazwell
函数变量必须返回或打印某些内容或为全局变量赋值。否则,没有意义使用它。其次,你必须在函数本身之外的地方调用它。
def fucn1():
..
return variable
def fucn2():
..
print variable
def fucn3(v):
global value
..
value = variable
print func1()
func2()
func3(v1)
你是什么意思,它停止工作?你期望它做什么?这是什么做错了? –
'replicas = newReplicas'此行删除对原始列表的引用,并将'replicas'设置为指向您的'newReplicas'变量。相反,在函数的末尾有一个'return newReplicas',并在你的代码中有一行像'replicas = branc(replicas)'一样改变 –