Найти - Пользователи
Полная версия: Разная работа приравнивания списка и метода ".append()" внутри функции.
Начало » Python для новичков » Разная работа приравнивания списка и метода ".append()" внутри функции.
1 2 3 4 5
xam1816
Olezhka
Как же так-то?! Опять создается одноименный экземпляр по другому адресу памяти?
в переменной хранится указатель на объект = некий адрес, по которому этот объект хранится в памяти.

Переменная написанная большими буквами по факту не константа, это некая договоренность, что в начале файла описываются константы которые менять не нужно, только читать
Olezhka
xam1816
почему ты не развиваешься???
Ладно! Установлю! Не ругайся! Просто я с “IDLE” начал и уже к нему привык. А в “PyCharm” режим отладки с указанием значений всех переменных в режиме реального времени есть?
xam1816
Olezhka
А в “PyCharm” режим отладки с указанием значений всех переменных в режиме реального времени есть?
дебаггер называется, он там есть
Olezhka
xam1816
Ясно. Спасибо
py.user.next
Olezhka
Опять создается одноименный экземпляр по другому адресу памяти?
Строки всегда создаются по новой. Сравни их id до операции += и после. Это разные строки. В питоне нет констант. В других языках есть константы.
Olezhka
py.user.next
В питоне нет констант.
Спасибо! Буду знать! А кортеж, строка не есть подобие констант?
py.user.next
Olezhka
А кортеж, строка не есть подобие констант?
Есть два понятия констант. Константы, который не переменные. Константы, которые значения.

Например, число 1 - это константа. Но что это даёт? Ничего. Числовая константа. Есть символьные константы, есть строковые константы. Это понятие константы тебе не даёт ничего. Оно просто идёт в качестве определения каких-то конструкций в языке программирования.

А вот именованная неизменная область памяти, это уже что-то даёт программисту. Есть переменная, которая является именованной изменяемой областью памяти, в которой может храниться значение определённого типа. И есть константа, которая является именованной неизменной областью памяти, в которой может храниться значение определённого типа.

Вот этих вторых констант нет в питоне, а в других языках они есть и для них есть специальный синтаксис в этих языках. Часто он выглядит в виде квалификатора const.

Вот я открыл в браузере через F12 консоль и там набираю в JavaScript.
Создаю константу n , вывожу её значение на экран, а потом пытаюсь её поменять и оно сразу пишет ошибку, потому что константы менять нельзя
  
>> const n = 3
<- undefined
>> console.log(n)
3
<- undefined
>> n = 4
Uncaught TypeError: invalid assignment to const 'n'
    <anonymous> debugger eval code:1
>>
Olezhka
py.user.next
Ясно. А какой смысл этих констант? Это чтобы по забывчивости не изменить случайно какое-то важное значение в программе, которое менять нельзя? Ну, допустим, пароль для логина в “requests”.
А насколько та область памяти, в которой в других языках сохраняются константы, РЕАЛЬНО защищена от изменений? Я просто помню “Artmoney”… Адреса памяти… Я ведь уверен, что и в “Пайтоне”, и тем более в “С” есть модули, позволяющие непосредственно и низкоуровнево работать с адресами памяти (почти как в АСМ). Неужели, даже в АСМе есть области памяти или регистры процессора, которые он не может изменить?! POP, PUSH там какими-нибудь…
py.user.next
Olezhka
А какой смысл этих констант? Это чтобы по забывчивости не изменить случайно какое-то важное значение в программе, которое менять нельзя?
Главный их смысл в том, что они быстрее обрабатываются. В питоне их нет, но это не проблема ни для кого. Люди всегда помнят, где у них константы, для этого достаточно их просто обозначить большими буквами. Например, в tkinter ты их видишь в виде LEFT, BOTH и так далее. Вот большие буквы это и значат, что это какие-то константы, которые имеют фиксированное значение. При этом их можно поменять так же прекрасно, потому что в питоне нет констант.

  
>>> import tkinter.constants
>>> 
>>> dir(tkinter.constants)
['ACTIVE', 'ALL', 'ANCHOR', 'ARC', 'BASELINE', 'BEVEL', 'BOTH', 'BOTTOM', 'BROWSE', 'BUTT', 'CASCADE', 'CENTER', 'CHAR', 'CHECKBUTTON', 'CHORD', 'COMMAND', 'CURRENT', 'DISABLED', 'DOTBOX', 'E', 'END', 'EW', 'EXTENDED', 'FALSE', 'FIRST', 'FLAT', 'GROOVE', 'HIDDEN', 'HORIZONTAL', 'INSERT', 'INSIDE', 'LAST', 'LEFT', 'MITER', 'MOVETO', 'MULTIPLE', 'N', 'NE', 'NO', 'NONE', 'NORMAL', 'NS', 'NSEW', 'NUMERIC', 'NW', 'OFF', 'ON', 'OUTSIDE', 'PAGES', 'PIESLICE', 'PROJECTING', 'RADIOBUTTON', 'RAISED', 'RIDGE', 'RIGHT', 'ROUND', 'S', 'SCROLL', 'SE', 'SEL', 'SEL_FIRST', 'SEL_LAST', 'SEPARATOR', 'SINGLE', 'SOLID', 'SUNKEN', 'SW', 'TOP', 'TRUE', 'UNDERLINE', 'UNITS', 'VERTICAL', 'W', 'WORD', 'X', 'Y', 'YES', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
>>>
>>> tkinter.constants.LEFT
'left'
>>> tkinter.constants.YES
1
>>>

В других языках, где есть константы в виде синтаксических конструкций языка, эти константы не только запускают оптимизацию в отношении себя, потому что константы требуют меньше операций (они только читаются, а писать их не надо, поэтому вокруг них и нет этой обвязки писательской), но и также проясняют написанный код. Когда ты видишь определённую функцию или только сигнатуру этой функции, в которой принимаемые аргументы какие-то константные, а какие-то переменные, то ты лучше понимаешь, как эту функцию вызывать можно, а как её вызывать нельзя, что в неё можно передать, а что в неё нельзя передавать. Например, если функция принимает только один константный массив, то ты уже заранее знаешь, что если ты передашь в неё любой массив, то функция его не поменяет, а просто будет читать его только. Но если функция принимает только один переменный массив (неконстантный), то ты уже заранее знаешь, что если ты передашь в неё любой массив, то функция его может запросто поменять, поэтому надо дополнительно учесть этот момент, чтобы ты потом не столкнулся с какими-то неожиданными изменениями в массиве, которые тебе не были нужны.

То есть у тебя больше контроля над кодом. Ты пометил какую-то хрень константной и не переживаешь больше за неё. Даже если она потом будет передана функции, которая принимает переменный аргумент и может поменять его, то у тебя компилятор выдаст ошибку в стиле “вы подаёте константную хрень в функцию на месте неконстантного аргумента, обратите внимание, что так делать нельзя”. И ты такой “о! точно! это я вот не подумал! надо исправить код!”. Вот так это работает.
Olezhka
py.user.next
Ясно! Спасибо за подробное объяснение! А ты в “Пайтоне” не работал с модулями прямого доступа к памяти? Не редактировал что-нибудь в ОЗУ на лету?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB