Python 2.7: L + = branch_length приводит к тому, что NameError: имя 'L' не определено - PullRequest
1 голос
/ 08 октября 2011

Это программа генетики популяций, разработанная моими профессорами и измененная студентами.

По сути, она должна имитировать ожидаемое количество мутаций в двадцать раз с заданной выборкой, популяцией и частотой мутаций (u),Однако критической частью является общая длина ветви (L), которая является суммой различных меньших длин ветви (branch_length).Однако, когда я определяю L, как показано ниже, он продолжает возвращаться с ошибкой:

  L += branch_length  
NameError: name 'L' is not defined

Я не уверен, что не так, поскольку tree_depth определен аналогичным образом и работает без нареканий.

Вот полный код:

from random import expovariate
from pgen import poidev
K = 77       # sample size (number of gene copies)
twoN = 5000  # population size
u = .001

tree_depth = 0.0 # age of last common ancestor in generations

# Each pass through loop deals with one coalescent interval.

for A in range(20):
    while K > 1:
        h = K*(K-1)/(2.0*twoN) # hazard of a coalescent event
        t = expovariate(h)       # time until next coalescent event
        tree_depth += t
        branch_length = t*K
        K -= 1
        L += branch_length
    S = poidev(u*L)
    print "Simulation:", A+1, "Total Mutations:", S
print "Total tree depth (L):", L, "generations"

Я просто что-то упускаю действительно, действительно очевидно?Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

L += x добавляет x к существующему L, но вы еще не инициализировали L. Предположительно, вы хотите L = 0 где-то в верхней части вашего файла.

1 голос
/ 08 октября 2011

Вам нужно определить L = 0 перед выполнением L += x.

В общем, перед изменением вам нужно определить переменную.Для задания нет проблем, потому что python выведет для вас тип.

Некоторые примеры:

>>> a += 0 #Invalid
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'a' is not defined
>>> a = 5 #Valid
>>> a += 0 #Now it's valid, because a is defined.
>>> 
>>> my_list.append(5) #Invalid
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'my_list' is not defined
>>> my_list = [] 
>>> my_list.append(5) #Now valid
>>> my_list
[5]
>>>
>>> my_list2 = [1, 2, 3, 4] #Valid, because it's an assignment.
...