Подтвердить что ты не робот

Почему целые числа неизменны в Python?

Я понимаю различия между изменяемыми и неизменяемыми объектами в Python. Я прочитал много сообщений, обсуждая различия. Однако я ничего не читал о целых числах WHY, которые являются неизменяемыми объектами.

Есть ли причина для этого? Или ответ "это как раз то, что есть"?

Изменить: мне становится предложено "отличить" этот вопрос от других вопросов, поскольку он, кажется, является ранее задаваемым вопросом. Тем не менее, я считаю, что то, что я прошу, скорее связано с философским вопросом Питона, чем с техническим вопросом Питона.

Похоже, что "примитивные" объекты в Python (т.е. строки, булевы, числа и т.д.) неизменяемы. Я также заметил, что производные типы данных, состоящие из примитивов (т.е. Dicts, lists, classes), являются изменяемыми.

Является ли строка, на которую нарисована линия, изменен ли объект? Примитивный и производный?

4b9b3361

Ответ 1

Выполнение целых чисел, изменяемых, было бы очень противоречивым для того, как мы привыкли работать с ними.

Рассмотрим этот фрагмент кода:

a = 1       # assign 1 to a
b = a+2     # assign 3 to b, leave a at 1

После выполнения этих назначений мы ожидаем, что значение 1 и b будет иметь значение 3. Операция добавления создает новое целочисленное значение из целого числа, сохраненного в a, и экземпляра целого числа 2. Если операция добавления просто взяла целое число в и только что изменила его, то и a, и b будут иметь значение 3.

Итак, мы ожидаем, что арифметические операции будут создавать новые значения для их результатов - не изменять их входные параметры.

Однако существуют случаи, когда мутация структуры данных более удобна и эффективнее. Предположим, что на тот момент, когда list.append(x) не изменил list, но вернул новую копию list с добавлением x. Тогда функция вроде этого:

def foo():
  nums = []
  for x in range(0,10):
    nums.append(x)
  return nums

просто вернет пустой список. (Помните - здесь nums.append(x) не изменяет nums - он возвращает новый список с добавлением x. Но этот новый список нигде не сохраняется.)

Нам нужно написать процедуру foo следующим образом:

def foo():
  nums = []
  for x in range(0,10):
    nums = nums.append(x)
  return nums

(Это, по сути, очень похоже на ситуацию с строками Python до примерно 2.6 или, возможно, 2.5.)

Кроме того, каждый раз, когда мы назначаем nums = nums.append(x), мы будем копировать список, который увеличивается по размеру, что приводит к квадратичному поведению. По этим причинам мы создаем списки изменяемых объектов.

Следствием создания списков mutable является то, что после этих операторов:

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

список b изменился на [1,2,3,4]. Это то, с чем мы живем, несмотря на то, что оно по-прежнему время от времени нас заводит.

Ответ 2

Каковы конструктивные решения, чтобы сделать номера неизменяемыми в Python?

Есть несколько причин неизменности, давайте посмотрим сначала , каковы причины непреложности?

1- Память

  • Сохраняет память. Если известно, что объект является неизменным, его можно легко скопировать, создав новую ссылку на тот же объект.
  • Производительность. Python может выделять пространство для неизменяемого объекта во время создания, а требования к хранилищу являются фиксированными и неизменными.

2- Быстрое выполнение.

  • Он не должен копировать каждую часть объекта, только простую ссылку.
  • Легко сравнивать, сравнение равенства по ссылке быстрее, чем сравнение значений.

3- Безопасность:

  • В приложениях с несколькими потоками Различные потоки могут взаимодействовать с данными, содержащимися внутри неизменяемых объектов, не беспокоясь о согласованности данных.
  • Внутреннее состояние вашей программы будет согласовано, даже если у вас есть исключения.
  • Классы должны быть неизменными, если у них нет веской причины сделать их изменчивыми.... Если класс нельзя сделать неизменным, ограничьте его изменчивость как можно больше

4- Простота использования

  • Легче читать, легче поддерживать и с меньшей вероятностью терпеть неудачу нечетным и непредсказуемым образом.
  • Неизменяемые объекты легче тестировать, не только из-за их легкой имитации, но и с шаблонами кода, которые они обычно применяют.

5- Ключи должны быть неизменными. Это означает, что вы можете использовать строки, числа или кортежи в качестве словаря. Это то, что вы хотите использовать.

The hash table implementation of dictionaries uses a hash value calculated from the key value to find the key. If the key were a mutable object, its value could change, and thus its hash could also change. But since whoever changes the key object can’t tell that it was being used as a dictionary key, it can’t move the entry around in the dictionary. Then, when you try to look up the same object in the dictionary it won’t be found because its hash value is different. If you tried to look up the old value it wouldn’t be found either, because the value of the object found in that hash bin would be different.

Возвращаясь к целым числам:

  • Безопасность (3), простая в использовании ( 4) и возможность использования чисел в виде словарей ( 5) являются причинами принятия решения о том, чтобы сделать числа неизменными.

  • Имеет фиксированные требования к памяти со времени создания (1).

  • Все в Python - это объект, numbers (например, строки) являются "элементальными" объектами. Никакая активность не изменит значение 8 на что-либо еще, и никакая активность не изменит строку "восемь" на что-либо еще. Это связано с тем, что решение в дизайне тоже.