#python #memory #memory-management
#python #память #управление памятью
Вопрос:
def f(b, a=[]):
a.append(b)
print('a : ', a)
f(1)
f(2)
# >> a : [1]
# >> a : [1, 2]
Я думал, что переменная ‘a’ осталась в памяти, потому что GC или счетчик ссылок не активировались.
def f(b, a=''):
a = b
print('a : ', a)
f('1')
f('2')
# >> a : 1
# >> a : 2
результат этой функции отличается. переменная a инициализируется при каждом вызове функции.
память словаря, набора, списка осталась после вызова функции. но int, строка была очищена. это другая система распределения памяти?
Комментарии:
1. В двух словах:
list.append
изменяет объект на месте. Но строки Python неизменяемы,=
они создают и присваивают новое значение.2. @KonradRudolph большое спасибо!
Ответ №1:
Причина в том, что list является изменяемым объектом. При первом вызове a инициализируется, а при последующих вызовах на него ссылаются. int и str являются неизменяемыми, как вы можете видеть ниже:
>>> str1 = 'hello'
>>> id(str1)
1900958690736
>>> str1 = 'how r u'
>>> id(str1) # is a different string now
1900958712176
Для достижения того, что вы ищете, вы можете использовать:
def f(b, a=None):
if not a:
a = []
a.append(b)
print('a : ', a)
f(1) # a : [1]
f(2) # a : [2]