Основные идеи неизменности остаются неизменными во всем объеме ООП и функционального программирования, или, например, Java и Python имеют свои собственные версии неизменяемости. Более конкретно, справедливо ли следующее на всех языках?

  • Изменяемые объекты: Set, Dict, List
  • Неизменяемые объекты: Bool, Int, Float, String, Tuple
  • В python два неизменяемых объекта с одинаковым значением также имеют одинаковый идентификатор, две ссылки на одно значение.
  • В python снова два изменяемых объекта с одинаковым значением не имеют одного и того же идентификатора, два ссылаются на два значения.
  • Поддерживается ли идея связывания двух ссылок вместе в изменяемых объектах на всех языках? И наоборот, привязки не могут быть изменены, то есть ссылки могут изменять только то значение, на которое они указывают.

    i = {1,2,3} # Set, a mutable object
    j = {1,2,3}
    i is j
    False
    i = j
    j.remove(3)
    i is j
    True
    

Я спрашиваю, потому что, например, в языках сценариев объекты передаются по ссылкам (в других языках передаются по значению или в C, где у нас есть и то, и другое), поэтому не меняет ли это все понятие неизменяемости?

-1
Ari 23 Сен 2018 в 04:26

2 ответа

Лучший ответ

Если у вас есть какой-либо объект, даже буквальный, он должен занимать некоторое пространство в памяти.

Эта память должна быть видоизменена языковой средой выполнения, и она остается неизменной, неизменна она или нет. Таким образом, изменяемые объекты изменяют память при создании объекта.

Таким образом, неизменяемый объект - это объект, который либо гарантированно не будет изменен во время компиляции, либо защищен средой выполнения при запуске программы.

В python два неизменяемых объекта с одинаковым значением также имеют одинаковый идентификатор, две ссылки на одно значение.

Я не думаю, что это вообще гарантировано. Например.

x = (1,2,3)
y = (1,2,3)
x is y
// => False

Когда я запускаю это в своем репл. Если это что-то вроде Common Lisp и Java, может случиться так, что реализации могут свободно повторно использовать области памяти одних и тех же литералов, и, следовательно, любой логический результат будет приемлемым.

1
Sylwester 23 Сен 2018 в 02:10

Как я понимаю разницу между изменяемым и неизменяемым в python, заключается в том, что первое можно изменить путем индексации. Например, следующий список x можно изменить путем индексации!

x = [1,2,3]
x[0] = 10

y = (1,2,3)
y[0] = 10 # this will raise an error. tuple is not mutable. 

y = x 

id(y) == id(x) #gives true. since y is a reference to x
y[0] = 10
print(y)
[10, 2, 3]
print(x)
[10, 2, 3] # x is changed as well! y and x are same same.

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

1
Khalil Al Hooti 23 Сен 2018 в 01:53