Каталог статей
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
типу, значение которого может быть изменено, это может привести к изменению исходных данных.