почему Python снова использует экземпляр класса внутри в функции

Строковые константы иногда лучше определяются как макросы, так как можно сделать больше со строковыми литералами, чем с const char *.

, например, Строковые литералы может быть , легко конкатенировал .

#define BASE_HKEY "Software\\Microsoft\\Internet Explorer\\"
// Now we can concat with other literals
RegOpenKey(HKEY_CURRENT_USER, BASE_HKEY "Settings", &settings);
RegOpenKey(HKEY_CURRENT_USER, BASE_HKEY "TypedURLs", &URLs);

, Если бы const char * использовались тогда, своего рода строковый класс должен был бы использоваться для выполнения конкатенации во времени выполнения:

const char* BaseHkey = "Software\\Microsoft\\Internet Explorer\\";
RegOpenKey(HKEY_CURRENT_USER, (string(BaseHkey) + "Settings").c_str(), &settings);
RegOpenKey(HKEY_CURRENT_USER, (string(BaseHkey) + "TypedURLs").c_str(), &URLs);

6
задан Fire Crow 9 December 2009 в 21:27
поделиться

2 ответа

Все, что показывает, - это то, что память объектов используется повторно, а не то, что новые объекты не создаются. На каждой итерации коллекция перезаписывается, поэтому счетчик ссылок на предыдущий объект падает, и интерпретатор Python может освободить свою память и повторно использовать ее (для следующего объекта).

>>> for a in range(1,5):
...     b = object()
...     print b, id(b)
... 
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9470> 3084620912

В этом случае 2 памяти локации используются повторно. Если бы вы добавили его в список (или сохранили в другом месте), он был бы сохранен:

>>> a = []
>>> for b in range(1,5):
...     c = object()
...     a.append(c)
...     print c, id(c)
... 
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9478> 3084620920
<object object at 0xb7db9480> 3084620928
11
ответ дан 8 December 2019 в 17:22
поделиться

из документации Python:

id () Вернуть «идентичность» объекта. Это целое число (или длинное целое число), которое гарантированно будет уникальным и постоянным для этого объекта в течение его времени жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id ().

3
ответ дан 8 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: