Разница в переменных в Java и Python

118
21 февраля 2022, 02:00

товарищи. Я долгое время программировал на Java, сейчас затронул Python и в голове немного помешалось. Помогите выпутаться) Прав ли я в следующем? В Java у нас есть примитивные и ссылочные переменные. Разница в том, что примитивные переменные ссылаются на непосредственно значение, а ссылочная - на ссылку, ведущую в более глубокую область памяти. А в Python у нас все переменные аналогичны ссылочным в Java.

Answer 1

В Java есть примитивные типы и есть объекты. Переменные примитивных типов содержат значение, а переменные типа class содержат ссылки на объекты.

В Python идея ООП доведена до абсолюта и:

Everything Is an Object

то есть всё является объектами, то есть с точки зрения Java программиста - все переменные в Python являются ссылками на объекты.

Answer 2

Вы правы.

Наиболее важные отличия Python от Java:

1) Все переменные - это просто указатели.

Пример:

>>> x = [1, 2]
>>> y = x # переменная y ссылается на тот же список, что и x
>>> print(y)
>>> y.append(3) # добавим элемент к y
>>> print(x) # x тоже изменился
[1, 2, 3]
>>> x = 4 # присвоим x какое-то иное значение
>>> print(y) # y не поменялся
[1, 2, 3]

2) Все переменные - это объекты.

>>> x = 3.0
>>> x.is_integer() # вызовем метод
True
>>> type(x) # проверим тип переменной
<type 'float'>
>>> x.__class__ # тип - это просто название класса
<type 'float'>

Answer 3

Коротко говоря все переменные в python это ссылки на какие то объекты, даже переменные примитивных типов. Подтверждение этому можно увидеть например так:

>>> a = 5
>>> type(a)
<class 'int'>

Но при этом любой объект типа int является неизменяемым (immutable). Пусть мы написали a = 5. Мы никаким образом не можем изменить содержимое области памяти на которую ссылается a, можем только начать ссылаться на другую область, например написав a = 6. Если проводить аналогии с Java то в python доступен только класс Integer но не примитивный тип int из Java

Бонус

Интересный факт: для типа int числа до 256 кешируются, то есть a = 5 и b = 5 это один и тот же объект (a и b ссылаются на одну область памяти), но при этом a = 257 и b = 257 это уже два разных объекта (a и b ссылаются разные области памяти)

>>> a = 256
>>> b = 256
>>> id(a)
10922656
>>> id(b)
10922656
>>> a = 257
>>> b = 257
>>> id(a)
139993530665008
>>> id(b)
139993530663408
READ ALSO
Как преобразовать элементы ArrayList в строки

Как преобразовать элементы ArrayList в строки

Задача стоит в том, чтобы удалить все дубли из коллекции, затем отсортировав, преобразовать числа в строкиНикак не могу сообразить, что не так!

169
Uri to FilePath и наоборот

Uri to FilePath и наоборот

СИТУАЦИЙ №1

211
Обновление entity. TransientObjectException

Обновление entity. TransientObjectException

Здравствуйте имеются 3 entity (Doctor, Patient, Recipe) которые с помощью Hibernate замапленны в БДRecipe имеет в качестве поля Doctor и Patient

98