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

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

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

  • Неизменяемые против Mutable типов
  • Неизменяемый объект в python
  • Редактирование: мне становится предложено «отличить» этот вопрос от других вопросов, поскольку это, кажется, ранее заданный вопрос. Однако я считаю, что то, о чем я прошу, скорее связано с философским вопросом Питона, чем с техническим вопросом Питона.

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

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

  • Неизменяемые против Mutable типов
  • Эффективное выполнение нескольких замещений строк в Python
  • Неизменяемая матрица?
  • Как создать неизменяемый объект в Python?
  • Удалить определенные символы из строки в python
  • Мутируемость аргумента ** kwargs в Python
  • 2 Solutions collect form web for “Почему целые числа неизменны в Python?”

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

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

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

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

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

    Однако бывают случаи, когда мутация структуры данных более удобна и эффективна. Предположим, что list.append(x) не 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] . Это то, с чем мы живем, хотя это время от времени нас заводит.

    Каковы проектные решения, чтобы сделать номера неизменными в 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 – это объект, числа (например, строки) являются «элементальными» объектами. Никакая активность не изменит значение 8 на что-либо еще, и никакая активность не изменит строку «восемь» на что-либо еще. Это потому, что решение в дизайне тоже.

    Python - лучший язык программирования в мире.