droft1312
Зачем вообще нужны константы? Я знаю, что они неизменяемы, но в чем их практическая суть?
Есть константы, а есть обозначения, они очень похожи и частенько сливаются воедино. Константы - это такие замены, изменение которых не влияет на работу программы. Обозначения - это такие замены, изменение которых может влиять на работу программы. Поэтому обозначения вводятся только для читаемости кода, тогда как у констант две функции - повышение читаемости кода и быстрое изменение большого объёма данных.
Пример
>>> import re
>>> re.findall(r'a', 'aaaAAA', flags=re.IGNORECASE)
['a', 'a', 'a', 'A', 'A', 'A']
>>> re.IGNORECASE
2
>>>
В модуле re есть константа IGNORECASE. Это значит, что если разработчики захотят заменить её значение с 2 на 512, то все коды, которые используют эту константу, продолжат работать правильно.
примечание:
Нельзя сказать, что это прямо абсолютная константа, потому что есть случаи, когда она участвует в побитовом сложении, поэтому ты не можешь ей придать значение 10, так как в десятке есть числа 2 и 8. Но вот для степеней двойки, которые не заняты другими константами, она будет именно константой, а не простым обозначением.
cutwater
неконстантный указатель на неконстантные данные (char * ptr)
да
cutwater
константный указатель на неконстантные данные (const char * ptr)
нет
Константный указатель - это переменная, содержимое которой нельзя изменить. В данном случае нельзя изменить данные.
cutwater
неконстантный указатель на константные данные (char * const ptr)
нет
В данном случае нельзя изменить указатель, тогда как данные можно менять.
cutwater
константный указатель на константные данные (const char * const ptr)
да
Чтобы не путаться, читай в обратном направлении: const char *const ptr => ptr const * char const: ptr - это константный указатель на char константный.
cutwater
аналогия terabayt с языком С++ некорректна
Он, по-моему, попытался проиллюстрировать кортеж кодом на C++, но получилось неправильно. Потому что кортеж больше походит на массив константных указателей на данные (константные или неконстантные), а у него там совершенно другое.
cutwater
UPD: Невнимательно изучил пример terabyt.
Не, у него там неправильно, ты просто тоже запутался. Указатели должны быть константными, а массив изначально имеет фиксированное количество элементов. А у него указатели можно менять, const относится к данным, которые не разрешается менять через этот массив указателей.
terabayt
const char* masks[] = {a, b};
Это не аналог кортежа
потому что там можно сделать
>>> a = ['a']
>>> b = ['b']
>>> c = ['c']
>>> t = (a, b)
>>> t[0] = c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>