Использование изменяемых аргументов функций для имитации C-подобных статических переменных в функциях Python

#python #c #mutable #static-variables

Вопрос:

Мне было интересно, как я мог бы скопировать статические переменные из C в Python. Я видел много сообщений, касающихся объектно-ориентированного кода на Python и использования изменяемых аргументов по умолчанию, но мне просто было интересно узнать о простом процедурном примере.

Вот мой пример C:

 void static_variable(){  static int x = 0;  x  ;  printf("%dn", x); }  

и вот мой пример с Python:

 def static_variable(counter=[0]):  counter[0]  = 1  print(counter[0])  

Оба примера работают, однако мне было интересно, несет ли использование такого подхода в Python некоторые присущие опасности — или это просто опасно, когда вы не знаете о изменяемых аргументах?

Ответ №1:

В python функции являются объектами первого класса. Это означает, что у них могут быть атрибуты. Вы можете просто использовать атрибут в качестве «статической переменной». Избегая ловушек изменяемых значений по умолчанию, код также становится намного чище:

 def static_variable():  # define function attribute  if hasattr(static_variable, 'counter'):  static_variable.counter  = 1  else:  static_variable.counter = 1  print(static_variable.counter)   static_variable() static_variable() static_variable()  

Результаты:

 1 2 3