2015-09-05 2 views
-3

В первый раз я запускаю этот блок кода из ноутбука он работает отлично:Python код отлично работает в первый раз, но терпит неудачу во второй раз

#Which letters and how many 
letters = ["a","b","c"] 
noOfLetters = len(letters) 

#Looking for all permutations 
resultA = [] 
from itertools import permutations 
for i in range(noOfLetters): 
    resultA.append(list(permutations(letters,i+1))) 

Если я запустить его снова (без перезагрузки ядра) я получаю следующее сообщение об ошибке:

TypeError         Traceback (most recent call last) 
<ipython-input-5-4050a4ce7a36> in <module>() 
     7 from itertools import permutations 
     8 for i in range(noOfLetters): 
----> 9  resultA.append(list(permutations(letters,i+1))) 

TypeError: 'list' object is not callable 
+3

В какой-то момент после этого кода, вы 'список = <что-то еще>'. Это затеняет встроенный «список» и вызывает проблему. Переименуйте его в 'lst' или что-то еще. Старайтесь никогда не теневать встроенные функции –

+0

Спасибо Адаму, это действительно так. – GDP

+0

@GretelDePaepe, если вы * должны * использовать то же имя, что и встроенное, одно соглашение заключается в добавлении подчеркивания к имени: например, в этом случае 'list_ =. , .', который не будет перезаписывать встроенный 'list'. – dbliss

ответ

1

Предполагая, что «ноутбук» является jupyter (ранее IPython ноутбуков), вы должны быть осторожны, что jupyter сохраняет состояние всех переменных.

-> Это означает, что второй запуск начинается с уже инициализированных переменных по значению, которое они имели в конце первого запуска.

Один из способов избежать перезагрузки ядра; другой - удалить все переменные; еще один - инициализировать все ваши переменные каждый раз, когда вы запускаете.

из docs:

To restart the kernel (i.e. the computational engine), click on the menu Kernel -> Restart. This can be useful to start over a computation from scratch (e.g. variables are deleted, open files are closed, etc...).

Смежные вопросы