Предполагая, что вы хотите «переменная, которая инициализируется только один раз при первом вызове функции», нет такой вещи, в синтаксисе Python. Но есть способы получить аналогичный результат:
1 - Используйте глобальный. Обратите внимание, что в Python, «глобальный» на самом деле означает «глобальный для модуля», а не «глобальный процессу»:
_number_of_times = 0
def yourfunc(x, y):
global _number_of_times
for i in range(x):
for j in range(y):
_number_of_times += 1
2 - Оберните ваш код в классе и использовать атрибут класса (то есть: атрибут который разделяется всеми экземплярами).:
class Foo(object):
_number_of_times = 0
@classmethod
def yourfunc(cls, x, y):
for i in range(x):
for j in range(y):
cls._number_of_times += 1
Обратите внимание, что я использовал classmethod
с этого фрагмента кода ничего не нужно из экземпляра
3 - Оберните ваш код в классе, использовать атрибут экземпляра и обеспечить ярлык для метода :
class Foo(object):
def __init__(self):
self._number_of_times = 0
def yourfunc(self, x, y):
for i in range(x):
for j in range(y):
self._number_of_times += 1
yourfunc = Foo().yourfunc
4 - Написать вызываемый класс и обеспечить ярлык:
class Foo(object):
def __init__(self):
self._number_of_times = 0
def __call__(self, x, y):
for i in range(x):
for j in range(y):
self._number_of_times += 1
yourfunc = Foo()
4 бис - использовать атрибут класса и метакласса
class Callable(type):
def __call__(self, *args, **kw):
return self._call(*args, **kw)
class yourfunc(object):
__metaclass__ = Callable
_numer_of_times = 0
@classmethod
def _call(cls, x, y):
for i in range(x):
for j in range(y):
cls._number_of_time += 1
5 - Сделать «творческий» использование аргументов функции по умолчанию быть инстанцирован только один раз при импорте модуля:
def yourfunc(x, y, _hack=[0]):
for i in range(x):
for j in range(y):
_hack[0] += 1
Есть еще некоторые другие возможные решения/хаки, но я думаю, что теперь вы получаете большую картину.
EDIT: с учетом разъяснений op, то есть «Предположим, что у вас есть рекурсивная функция с параметром по умолчанию, но если кто-то действительно пытается дать еще один аргумент вашей функции, это может быть катастрофическим», похоже, что OP действительно хочет это что-то вроде:
# private recursive function using a default param the caller shouldn't set
def _walk(tree, callback, level=0):
callback(tree, level)
for child in tree.children:
_walk(child, callback, level+1):
# public wrapper without the default param
def walk(tree, callback):
_walk(tree, callback)
Который, кстати, доказать, что мы на самом деле была еще одна проблема XY ...
Объявить эту переменную вне из для петель. –
Это не единственное, что объявляет локальную переменную 'static'. Скажите, пожалуйста, что вы хотите сделать с переменной в Python и какую проблему вы пытаетесь решить (прочитайте о проблеме XY) (http://meta.stackexchange.com/questions/66377/what-is- -х-проблема)). –
Обратите внимание, что Python имеет гораздо меньше областей, чем C++, поэтому для таких конструкций меньше необходимости. 'number_of_times' в Python-версии этого кода не будет ограничиваться внутренним циклом for. – chepner