Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2015 13:11:01

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

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

Офлайн

#2 Янв. 20, 2015 13:51:19

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

значит masks тоже не константа? а const говорит о обратном…

#include <iostream>

using namespace std;

int main()
{
char a[] = {'a', 'b'};
char b[] = {'c', 'd'};
const char* masks[] = {a, b};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cout << masks[i][j];
}
}
cout << endl << "--------------" << endl;
a[0] = 'e';
b[1] = 'o';
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
cout << masks[i][j];
}
}
cout << endl;
}
вывод
abcd

--------------

ebco



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Янв. 20, 2015 14:33:37

droft1312
Зарегистрирован: 2015-01-17
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

GreyZmeem
terabaytКонстанта (из вики) - способ адресации данных, изменение которых рассматриваемой программой не предполагается или запрещается.А данные внутри кортежа могут меняться.
Подобно строкам, кортежи неизменяемы. В доказательство приведу интерактивную
сессию:
»> inventory = (“меч”, “кольчуга”, “щит”, “целебное снадобье”)
>>> print(inventory)
('меч', ‘кольчуга’, ‘щит’, ‘целебное снадобье’)
>» inventory = “боевой топор”
Traceback Cmost recent call last:
File “<pyshell#З>”. line 1. in <module>
inventory[OJ = “боевой топор”
TypeError: object doesn't support item assignment
Хотя кортежи нельзя менять, из них можно создавать новые кортежи.

Из книги М.Доусона “Программируем на Python”.

Отредактировано droft1312 (Янв. 20, 2015 14:34:05)

Офлайн

#4 Янв. 20, 2015 14:54:20

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

droft1312
Зачем вообще нужны константы? Я знаю, что они неизменяемы, но в чем их практическая суть?В каких случаях их нужно использовать?
В общем случае они используются для обозначений крайне редко изменяемых значений, при том, изменяемых исключительно в процессе разработки, но не во время исполнения. Так улучшается удобочитаемость листингов и упрощается модификация значения константы ибо не нужно прочесывать весь проект поиском и заменой.

Офлайн

#5 Янв. 20, 2015 15:08:42

droft1312
Зарегистрирован: 2015-01-17
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

Shaman
Спасибо

Офлайн

#6 Янв. 20, 2015 15:10:54

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

UPD: Невнимательно изучил пример terabyt.



Отредактировано cutwater (Янв. 20, 2015 15:34:32)

Офлайн

#7 Янв. 20, 2015 15:26:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

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};
Это не аналог кортежа
masks = (a, b)
потому что там можно сделать
masks[0] = 0;

>>> 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
>>>



Отредактировано py.user.next (Янв. 21, 2015 01:27:09)

Офлайн

#8 Янв. 20, 2015 15:57:08

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

py.user.next
Он, по-моему, попытался проиллюстрировать кортеж кодом на C++, но получилось неправильно. Потому что кортеж больше походит на массив константных указателей на данные (константные или неконстантные), а у него там совершенно другое.

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

int main() {
char a[] = "ab";
char b[] = "cd";
char c[] = "de";
char * const tuple[] = {a, b};
tuple[0] = c;
return 0;
}



Отредактировано cutwater (Янв. 20, 2015 15:57:42)

Офлайн

#9 Янв. 20, 2015 16:02:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

cutwater
Если приводить аналогию кортежа на С++, то видимо должно быть как-то так
да
Они не равны, конечно, но похоже. Для равенства там должен быть массив указателей на void.



Отредактировано py.user.next (Янв. 20, 2015 16:05:14)

Офлайн

#10 Янв. 20, 2015 16:46:00

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Глупый вопрос насчет констант.

> а кортеж?

А строки с числами по твоему тоже “константы”?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version