Разница между распределением памяти списка и символа

#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]