Переменные и механизм сборки мусора в Python

1. Переменные в Python

pythonА javaпеременные в существенно разные.

javaПри объявлении переменной в переменной вы должны указать тип данных переменной, int, str или определенный тип, и тогда виртуальная машина будет подавать заявку на пространство в памяти.Размер пространства зависит от типа . Распространено мнение, что переменные представляют собой поле, и то, что может содержаться в этом поле, задается в начале.

Например a=1, введите 1 в поле.

pythonПеременная по сути является указателем, размер указателя такой же. Например, указатель на тип int, размер самого указателя фиксирован, и нет необходимости учитывать размер памяти, занимаемой самим int, но он все равно помещается в память. Вам нужно только найти указатель при доступе к объекту int.

Возьмем a=1, для начала, чтобы объявить объект типа int в памяти, чтобы открыть пространство для хранения 1, а затем 1 точку.

a = [1,2,3]
b = a
b.append(4)
print(a) # [1,2,3,4]

Если вы используете идею коробки, чтобы понять здесь: поместите список в [1,2,3]одно поле и поместите в другое поле, тогда, если вы напечатаете a после изменения b, a не изменится.

a = [1,2,3]
b = a
print(a is b) # True

Это isтакже можно видеть , что aсумма и bтот же объект, то есть a, то idзначение bострого предмета idявляется таким же , как значения острого предмета .

2. Разница между == и

  • является

Наконец, я сказал, a = [1,2,3] b = aчто a и b - это один и тот же объект. Так что, если это два задания?

a = [1,2,3]
b = [1,2,3]
ptint(a is b) # False
print(id(a) == id(b)) #False

Судя по результатам, a и b в это время являются разными объектами. Другими словами, объект будет повторно объявлен при использовании оператора присваивания.

Это особый случай:

a = 1
b = 1
print(a is b) #True

pythonВнутренний internмеханизм - при встрече с тем же маленьким целым числом в определенном диапазоне новый объект не создается, и он напрямую указывает на исходный объект. Механизм внутренней оптимизации.

То же самое и с маленькими струнами.

a = "abc"
b = "abc"
print(a is b) #True

Использование для оценки класса

class People:
    pass
person = People()
# isinstance(person,People)
if type(person) is People:
    print('Yes') # Yes

Поскольку сам класс является объектом, а объект является глобально уникальным, на personсамом деле указывает на него People, поэтому type(person)и Peopleидентификатор тот же.

  • ==
a = [1,2,3]
b = [1,2,3]
ptint(a == b) # True

a - это объект типа list. В списке реализована волшебная функция __eq__. Когда он встречает ==, он вызывает эту функцию, чтобы определить, равно ли значение объекта.

3. Оператор del и механизм сборки мусора.

pythonАлгоритм сборки мусора использует подсчет ссылок.

Сначала определите a=1, b=aа затем 1 автоматически сгенерирует счетчик для этого объекта, а a=1счетчик часов увеличится на 1, b=aуказывая, что b также указывает на a. В это время счетчик увеличивается на 1, что эквивалентно 1 с двумя переменными указывая на это.

Когда мы del aудалим объект, счетчик уменьшится на 1. Когда счетчик уменьшится до 0, интерпретатор Python вернет объект (не может быть постоянно занят в памяти).

Оператор delete в C ++ предназначен для непосредственного восстановления объекта, который отличается от python.

Дайте каштан

a=object()
b=a
del a
print(b) # object object at 0x0000000003D90F0
print(a) # name a is not defined

Результатом выше является то, что b можно напечатать, но нельзя напечатать. Процесс состоит в том, чтобы удалить объект a и уменьшить счетчик ссылок на 1.

Когда pythonинтерпретатор забирает объект, он вызывает __del__магическую функцию объекта . Поэтому, когда мы выполняем сборку мусора, мы надеемся, что определенные ресурсы будут высвобождены при повторном использовании объекта, что может быть достигнуто путем перегрузки __del__функций.

class A:
	def __del__(self):
		pass

4. Некоторые примечания о списке входящих

Первый случай

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = 1
    b = 2
    c=add(a,b)
    print(c) # 3
    print(a,b) # 1 2

Второй случай

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = [1,2]
    b = [3,4]
    c=add(a,b)
    print(c) # [1,2,3,4]
    print(a,b) # [1,2,3,4] [3,4]

Было обнаружено, что вход a изменился в это время, потому что список является типом переменной, а символ + = непосредственно присваивается исходной переменной списка a во время работы, поэтому исходный a был изменен.

Третий случай

def add(a,b):
    a+=b
    return a
if __name__ == "__main__":
    a = (1,2)
    b = (3,4)
    c=add(a,b)
    print(c) # (1,2,3,4)
    print(a,b) # (1,2) (3,4)

подводить итоги

Когда передаются три разных типа параметров, только объект списка влияет на исходные данные.

Таким образом, при передаче объекта в функцию, если объект относится к list、dictтипу, значение которого может быть изменено, это может привести к изменению исходных данных.

рекомендация

отblog.csdn.net/weixin_43901214/article/details/107039987
рекомендация