Изменяемые и неизменяемые объекты реализованы одинаково во всех языках программирования? - PullRequest
0 голосов
/ 23 сентября 2018

Основные идеи неизменности остаются неизменными в рамках ООП и функционального программирования или, например, 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, где у нас есть оба), поэтому не изменит ли это само понятие неизменности?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

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

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

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

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

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

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

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

0 голосов
/ 23 сентября 2018

Насколько я понимаю, разница между изменяемым и неизменяемым в 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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...