Можно порекомендовать автору не напускать туману насчет "сложностей" оператора is, а начинать с главного - разницы между понятиями равенства (equals) и идентичности (identity), после этого вопросы и нюансы насчет того, когда какой использовать отпадает сам собой.
@Ivan_Balakirev2 жыл бұрын
и еще, что объекты бывают изменяемые и нет и какие
@azerkoron Жыл бұрын
Он одну и туже информацию повторяет раз по десять, добавляя немножко нового, это раздражает, ощущение что растянуть видео хочет
@imfiwile8995 Жыл бұрын
@@azerkoron за видео короче 10 минут не платят деньги
@meetthespy3398 Жыл бұрын
@@imfiwile8995 ни за какое видео не платят деньги, очнись
@shadowplay1211 Жыл бұрын
Согласен, одна вода в видео
@EvgenijJobs2 жыл бұрын
А теперь небольшой нюанс. Если писать не в консоли, где подтягивается только сам интерпретатор, а запускать скрипт, то все числовые значения будут иметь одинаковые адреса. Это связано с оптимизацией по памяти. Грубо говоря, python хранит значения в виде словаря, где ключ - значение. Со строками такое кеширование работает несколько иначе. Ниже в комментариях уже поясняли механику - сначала берется объект b ('hell') и объект 'o', происходит формирование нового объекта 'hell'+'o'. Поэтому адрес в памяти разный выходит (строки оптимизируются несколько иначе, когда мы их получаем в несколько этапов). При обычной конкатенации значений (без переменных) такого не происходит, потому что опять же оптимизация и строка получается сразу той, которая нужна. Примеры a = 'hello' b = 'hell' + 'o' a is b # True a = 'hello' b = '' # пустая строка c = 'hell' + b + 'o' a is c # False Но, если сделать вот так (подтягивается оптимизация с пустой строкой в конце): a = 'hello' b = '' # пустая строка c = 'hello' + b' a is c # True Аналогично с пустой строкой вначале: a = 'hello' b = '' # пустая строка c = b + 'hello' a is c # True Еще в видео было бы уместно добавить про записи, типа a = b = 1000
@Dmytro-Tsymbaliuk2 жыл бұрын
Да, когда транслятор видит код целиком, то он бы в .exe файлах переменные с одинаковым значением занес бы в секцию .data(если константа, то в .rdata)
@dail45682 жыл бұрын
"То все числовые значения будут иметь одинаковый адрес", нет не будут. Если вы не знаете python внутри то вот: по умолчанию, в питоне числа от -5 до 256(это можно настроить если вы сами компилируете свой питон) являются простыми числами(ну в исходниках они "small_int" и имеют 1 адрес.)
@tzn95975 ай бұрын
Он говорил что если написать a = 1111 и b = 1111 в файле, то выведет True, так как у них одна и та же ссылка на pyobject, а в консоле как раз значения от -5 до 256. @@dail4568
@user-of-world Жыл бұрын
В Python оператор "is" используется для проверки, указывают ли две переменные на один и тот же объект в памяти. Например, предположим, что у нас есть две переменные "a" и "b", которые указывают на один и тот же список в памяти: css Copy code a = [1, 2, 3] b = a Затем мы можем использовать оператор "is", чтобы проверить, указывают ли эти две переменные на один и тот же объект в памяти: python Copy code print(a is b) # True Однако, если мы создадим новый список с теми же значениями и присвоим его переменной "b", оператор "is" вернет "False", потому что теперь "a" и "b" указывают на разные объекты в памяти: css Copy code b = [1, 2, 3] print(a is b) # False В общем случае, оператор "is" используется для проверки идентичности объектов, а не их эквивалентности. Это означает, что даже если два объекта имеют одинаковое значение, они могут быть разными объектами в памяти и оператор "is" вернет "False". Какие проблемы может создать использование этого оператора? Хотя оператор "is" в Python может быть очень полезным для определения, указывают ли две переменные на один и тот же объект в памяти, некоторые проблемы могут возникнуть, если его использовать неправильно. Ниже перечислены некоторые из этих проблем: Неверное сравнение объектов: Поскольку оператор "is" сравнивает объекты по их идентичности, а не по их значению, его использование для сравнения значений может привести к неправильным результатам. Например, если вы сравниваете два списка с одинаковыми значениями, но разными объектами в памяти, оператор "is" вернет "False", хотя эти два списка эквивалентны. Ошибки при сравнении переменных разных типов: Оператор "is" не может использоваться для сравнения переменных разных типов, и в этом случае может возникнуть ошибка. Неверное использование оператора "is" вместо "==" для проверки эквивалентности: Если вы хотите сравнить два объекта на эквивалентность, то следует использовать оператор "==" вместо "is". Использование оператора "is" вместо "==" может привести к неправильным результатам, особенно при работе со строками и числами. Проблемы с кэшированием: В Python некоторые объекты, такие как небольшие целые числа и некоторые строки, кэшируются для повышения производительности. В этом случае две переменные могут указывать на один и тот же объект в памяти, несмотря на то, что они были созданы независимо друг от друга. Это может привести к ошибкам, если вы используете оператор "is" для сравнения таких переменных. Проблемы с изменяемыми объектами: Если вы изменяете изменяемый объект, на который указывают две переменные, это может привести к непредвиденным результатам, если вы не ожидаете, что эти переменные указывают на один и тот же объект в памяти. В таком случае следует использовать копирование объекта, чтобы создать новый объект, а не изменять существующий объект.
@А.Т-ш5с11 ай бұрын
Спасибо!
@АндрейМихайлов-о6я3ц2 жыл бұрын
6:30 - "как пишут на различных сайтах" - одна бабка сказала, а она-то врать не будет. блин. сам же пользуется id, вызвал бы id до добавления символа и после, и тогда бы внезапно обнаружилось, что строки в питоне неизменяемые, а любая операция со строкой, "модифицирующая" её - это просто создание новой строки. при этом старая никуда не девается и не изменяется, если на неё есть ссылки. объясняет то, чего сам не понимает.
@bronis_lav2 жыл бұрын
Питон для оптимизации, значения размером с байт хранит в одном экземпляре. Есть локальные константы и если вы поменяете значение, то поменяется просто ссылка на другую константу. Небольшие значения используются часто и вполне логично, зачем в памяти размещать отдельную ячейку если такая уже есть. Поэтому все значения вписывающиеся в размер байта ссылаются на константы. Питон проверяет, если объявленная вами переменная имеет значение от 0 до 255, то производится проверка, если такое значение есть в локальных переменных, то оно просто ссылается на него, если нету, то создается новая константа. Но если значение больше 255 то под новую переменную выделяется память. По такому принципу работают виртуальные машины вроде JVM но вообще со всеми типами данных, не то чтобы я спец по питону или шибко догадливый xD Проблема тут не в операторе is, подобные есть во многих языках, а в "программистах" не знающих как оператор работает или не понимающих разницу между ссылкой на ячейку памяти и значением в памяти. Зачем городить такое видео, если просто очевидно есть операторы сравнивающие ссылки, а не данные.
@ЙенФенФыр2 жыл бұрын
а вы случайно не знаете откуда берётся нижняя граница -5? Гугл не помог мне с поиском этой информации. Есть записи в духе "так оптимально!", но почему именно начинать с -5 - это оптимально не говорят
@TeslaDln2 жыл бұрын
@@ЙенФенФыр. Видимо для пользователя Nelsy это видео "просто очевидно", а Ваш вопрос нет.
@МаксимМячин-н6р2 жыл бұрын
Для опытного может показаться фигней эта инфа, но для такого новичка, как я, эта инфа была довольно интересной и крайне полезной. Теперь, если буду сравнивать переменные с bool-значениями, то буду использовать оператор "is", а не двойное равно. Лайк для видео!
@ivkrak8258 Жыл бұрын
Не сравнивай, а просто пользуйся тем, что оператор «if» работает только при истинном выражении. if a == True --> if a
@whoareyou84802 жыл бұрын
Если переменная (допустим а) проверяется в if-statement на значение True или False, pep8 советует проверять её как if a: без использования is. Ну и бонусом очередной прикол со списками питона: а = [[1, 2, 3]] * 3 а[0][0] = 5 print(a) Получим [[5, 2, 3],[5, 2, 3],[5, 2, 3]] Потому что а - список, членами которого являются три одинаковых ссылки на один и тот же объект списка
@tohoto21832 жыл бұрын
Это вообще мало кто использует , такая дичь вообще легко забывается ,а значит в питоне под запретом.
@fish93702 жыл бұрын
Тем, кто пришел из других языков, волосы дыбом становятся от таких возможностей. Я в шоке
@ncertus Жыл бұрын
Это видео должно быть не об операторе "is" - с ним никаких проблем нет. Вся суть в переменных python, вернее в их отсутствии. Каждая "переменная" это "имя" ссылающееся на PyObject с типом данных, счетчиком ссылок и значением. Тут надо помнить, что большинсво типов - неизменяемы, т.е. меняя значение переменной с любым типом, кроме словаря, списка или множества, мы создаем новый PyObject. "is" возвращает "true" из-за peephole-оптимизации в Cpython, которая старается интернировать повторяющееся объекты.
@5vFreeNz2 жыл бұрын
Шикарный канал! Живи, человек! Спасибо!
@zproger2 жыл бұрын
Рад был помочь :)
@wtfmaruni2 жыл бұрын
Первый месяц как начал изучать Python, твой канал супер!
@zproger2 жыл бұрын
Благодарю!
@Тимофей-т5э2 жыл бұрын
Вау, не знал об этом, спасибо за новую информацию!
@zproger2 жыл бұрын
Рад что было полезно :)
@ДрейнРул2 жыл бұрын
😶🌫️
@kequing792 Жыл бұрын
Тимофей, прошло 8 месяцев, как ты начал изучать Пайтон, чего добился ?
@WHT_-ue2rl2 жыл бұрын
Очень прикольное видео. Слава Богу, что наткнулся на твоё видео, а то пихал этот бедный is куда не попадя))) Правда потом использовал только оператор равенства Лайк! И подписка конечно же!
@zproger2 жыл бұрын
Благодарю, рад что помогло
@programming_etc2 жыл бұрын
Годнота. Кстати какую систему юзаешь? Если не ошибаюсь, это же федора?
@zproger2 жыл бұрын
Zorin OS
@ValeriyLarin2 жыл бұрын
Спасибо за доступное разъяснение. Жду новых видео)
@zproger2 жыл бұрын
Рад что понравилось
@tinylith16032 жыл бұрын
Python 3.10.4 (main, Apr 2 2022, 09:04:19) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a, b = 1111, 1111 >>> a is b True >>> a = 1111; b = 1111 >>> a is b True >>> a = 1111 >>> b = 1111 >>> a is b False
@zproger2 жыл бұрын
+1 странность :D
@eg0or4992 жыл бұрын
Ребят, поправьте меня я только начал изучать пайтон. В 6:09 ты говоришь, что сложно это понять. Строке hell присваивается новый айди из-за того, что строки являются неизменяемыми типами(это написано в любом учебнике по пайтон на первых страницах )данных и по сути когда к hell ты добавил o, пайтон затер строку hell и создал новую строку с соответственного новой ссылкой и на ячейку памяти. Это не флейм не упрек. Так классные видосы я смотрю тебя
@Taron8117 Жыл бұрын
Спасибо за подробности. Посмотрел несколько видео и только у Вас подробно о том, почему так
@НурболатЗару2 жыл бұрын
Отличный материал, успехов вам
@zproger2 жыл бұрын
И вам успехов :)
@artembagachkov9332 жыл бұрын
Вау, ты всегда объясняешь быстро, глубоко и понятно, а не так как множество блогеров, что только поверхностно затронут тему, и будут лить воду 10 минут
@zproger2 жыл бұрын
Круто, спасибо :)
@zzzzzzzz67922 жыл бұрын
@@zproger это сарказм, бро
@Никита-п1й8й2 жыл бұрын
@@zzzzzzzz6792 учитывая что это подписчик думаю нет
@lolphdundgren43282 жыл бұрын
Странно. Что на двойке, что на тройке, в обоих случаях выдаётся True xxxx@xxxx:~$ python Python 2.7.17 (default, Mar 18 2022, 13:21:42) [GCC 7.5.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a, b = 10, 10 >>> print(a is b) True >>> a, b = 455, 455 >>> print(a is b) True >>> quit() xxxx@xxxx:~$ python3 Python 3.6.9 (default, Mar 15 2022, 13:55:28) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a, b = 10, 10 >>> print(a is b) True >>> a, b = 455, 455 >>> print(a is b) True >>>
@zproger2 жыл бұрын
Действительно странно. А из под какой оболочки вы это запускаете? Не из под IDE случайно?
@lolphdundgren43282 жыл бұрын
@@zproger Mint Linux, из-под баша.
@flexyyyapk6 күн бұрын
2.7....
@anty11012 жыл бұрын
Спасибо за видео, познавательно. А из комментов узнал ещё больше.
@zproger2 жыл бұрын
Это хорошо
@P0dCasts.io6o2 жыл бұрын
Не знал. Спасибо авторам!
@zproger2 жыл бұрын
=)
@ГеннадийШушпанов-д1ч2 жыл бұрын
Коллеги, подобные "чудеса" случаются из-за небрежности в изучении семантики операторов. "Сравнение значений объектов"! и "Проверка идентичности объектов" -- разные операции и не взаимозаменяемые.
@Dmitriitube Жыл бұрын
Ну и почему кэшируются значения от -5 до 256? Почему были выбраны именно такие значение?
@mrdixioner6 ай бұрын
Тоже не услышал ответа.
@tzn95974 ай бұрын
Наверно самые часто используемые
@whale52192 жыл бұрын
Строки это неизменяемый тип данных и в данном примере просто создается новый объект с тем же именем в другой ячейке памяти. Списки же наоборот являются изменяемыми от чего id и не меняется.
@al_xy2 жыл бұрын
Странный вопрос, но может быть ты или другой опытный человек, мог бы помочь мне определиться в сложившемся положении, буду крайне благодарен) Мне 20 лет, на данный момент учусь на 2 курсе в вузе, на прогера. Изучаем почти всё, что касается: базы данных, фронтенд, немного был геймдев, машинное обучение, собственно сам кодинг на C#, на следующем курсе будет бэкенд и т.д. Изначально я хотел посвятить себя самообучению 3D графике и дизайну, т.к., но семья убедила пойти в вуз. И вот, уже к концу 1 курса я начал отставать от учебной программы, т.к. пропадал интерес и желание, плюс я долго болел ковидом, возможно из-за того, что в вузе вместо настоящего программирования, дают всякие курсовые работы и кучу ненужной воды (сейчас я достаточно сильно отстал от программы). Останавливает меня от отчисления мысль о возможности получения диплома ВО в сфере кодинга и геймдева (что возможно было бы полезно для карьеры в 3D). Быть 3д художником, честно говоря хочется больше, чем прогером, мне нужно решить, отчисляться и вливаться в 3D, или упорно всё свободное время тратить, чтобы догнать учебную программу, закончить вуз и получить этот диплом (даже не знаю, стоит ли это того). Место проживания также играет значительную роль, ведь программисту 100% будет легче найти работу в регионе, да и, наверное, в принципе, в России... P.S. Моделировать, фотошопить, создавать что-то, креативить, заниматься творчеством, я делаю это в первую очередь из интереса, а программирование, наверное (это не точно), финансово выгодно и крайне актуально, не требует мощного железа, можно работать хоть в деревне, хоть на луне, и на обычном ноутбуке, а для того же 3д нужна мощная станция, это проблема для мобильности, да и стоит она не мало. Как один из факторов, учёба не дешёвая, эти деньги семья могла бы потратить на более важные нужды, я не очень понимаю, стоит ли оно того Отчислятся также обидно т.к. это моё первое образование, и получается, если отчислюсь, стану ненужным самоучкой (так говорят родители), в то время, как все остальные знакомые получат дипломы и станут квалифицированными спецами И небольшой вопрос, не по теме: Стоит ли покупать ноут или лучше вложиться в улучшение пк (мой пк: 16 гб, 1660S, i5 6600)?
@anri_khv Жыл бұрын
Очень полезная информация, простым языком на понятных примерах, подпишусь!!!
@A5ter2 жыл бұрын
Не представляю каким образом за 5 лет кодерства я не столкнулся с потребностью копировать списки. Да, я не знал про эту примитивщину. О_о Спасибо!
@zproger2 жыл бұрын
Бывает) Тут ещё очень много таких подвохов, знать о всех сразу нереально
@Fluery-91062 жыл бұрын
@@zproger в питоне это явно более реально, нежели в JS, где всяких неявных преобразований дохренилион с лишним)
@artyom_trustee2 жыл бұрын
как можно кодить 5 лет и не знать как работает память?
@Dmytro-Tsymbaliuk2 жыл бұрын
@@Fluery-9106 это намного явнее, если использовать язык с явными указателями, там такой вопрос как-то не возникает, ибо и так все понятно
@taee19382 жыл бұрын
@@artyom_trustee так он питонист)
@ИванВалеев-б1й2 жыл бұрын
b += 'o' ==> b = b + 'o' ==> сначала высчитывается правая сторона, получается новый объект и новая ссылка на него.
@zproger2 жыл бұрын
Интересно
@gfhhg-hfsvbufxv-jyxbn2 жыл бұрын
Очень круто! Спасибо, я не знал!
@zproger2 жыл бұрын
Рад что понравилось :)
@evgeny_01_122 жыл бұрын
Спасибо, за полезную информацию!)
@zproger2 жыл бұрын
Пожалуйста :)
@СергейЛинник-с5к2 жыл бұрын
Никогда не использовал is для сравнения строк и чисел, но спасибо за информацию. Очень любопытно.
@zproger2 жыл бұрын
=))
@flueriexeflueriexe70402 жыл бұрын
Но спасибо Вам за Ваши старания!!!!! Ждём новых видео!!!!
@zproger2 жыл бұрын
Спасибо :)
@agentsmit092 жыл бұрын
На питоне не кодирую постоянно. Оказывается он очень коварный. Он оказывается не присваивает значения, а просто передает ссылку. Сишнику будет трудно к такому привыкнуть.
@zproger2 жыл бұрын
Ну да, Python же под капотом на Си работает
@agentsmit092 жыл бұрын
@@zproger Я про то что и не в курсе был, что питон вместо передачи значения по факту передает ссылку. В Си все четко, передаешь значение - передается значение, передаешь ссылку - значит будет ссылка
@Dmytro-Tsymbaliuk2 жыл бұрын
И не нужно привыкать, питон временый, а Си вечный
@axathearcticfox55142 жыл бұрын
Спасибо! 1.5 часа парился с хрена ли "i^m" не равно "i^m". Не понимал какого хрена это так работает. Теперь мне стало понятней.
@zproger2 жыл бұрын
круто =)
@ВолодимирБожко2 жыл бұрын
Дякую! Цікаве та корисне відео!
@zproger2 жыл бұрын
Благодарю :)
@loktarogar60172 жыл бұрын
Годний контент, лайк 👍
@zproger2 жыл бұрын
Благодарю
@ViktorTolmachev Жыл бұрын
Спасибо, видео полезное!
@__s__a__b__i__r__2 жыл бұрын
Просьба снимать похожие видосы, всё по порядку объяснил , спасибо
@zproger2 жыл бұрын
Круто, буду стараться делать подобные видео =)
@mcomponent2 жыл бұрын
Драсьте, расскажите про Cython и Ctypes в планах оптимизации, если можно. Вкратце, Python хорошо контактирует с C и C++ и это часто используется в целях оптимизации. Cython - отдельная надстройка над питоном в виде модуля, которая позволяет компилировать дополненный синтаксис в C. А ctypes позволяет загружать и связывать DLL и Shared библиотеки в Python, это выглядит примерно так же, как динамическая подгрузка в C (если вы занимались этим когда нибудь). Ctypes быстрее, но поддерживать трудно. Cython медленнее, в некоторых ситуациях он даже даёт лишнее время выполнение по сравнению с обычным питоном, ведь вся оптимизация в основном построена на статической типизации, но поддержка проще и быстрее. Cython ещё можно распространять в виде пакета PyPI.
@VideoWWB2 жыл бұрын
Спасибо большое ,вчера мудохался с парсером и думал в чём проблема ,а вот она оказывается.)
@zproger2 жыл бұрын
Рад что помогло =)
@logitec19942 жыл бұрын
Вся информация полностью новая, спасибо)
@normpochan Жыл бұрын
В питоне же всё является объектами, в том числе и числа. Под первые (не помню сколько, но вроде в диапазоне 200-300) сразу выделяется память, независимо от того, используем мы их или нет. Таким образом, когда мы пишем a = 200, b = 200, мы просто создаём ссылку на объект числа 200. А когда создаём большую чиселку, мы каждый раз создаём новый объект? Правда хз, что мешает нам создать объект большого числа один раз, а потом просто ссылки создавать, но видимо какой-то сакральный смысл в этом есть) upd: Не знал, что не первые 2хх чисел, а в диапазоне от -5 до 256. Теперь буду, спасибо)
@Fluery-91062 жыл бұрын
Никогда не приходилось пользоваться оператором "is", пользовалась им разве что когда учила python и не знала, для чего он нужен на самом деле. Если мне нужно сравнить значение, то, очевидно, оператор равенства "==", а если же нужно проверить переменную на "наличие значения", если можно так выразиться, то просто "if variable_name: ..." или "if not variable_name: ..." если нужно убедиться, что переменная является None, False, [], {}, либо еще чем-то пустым. Извиняюсь, если что-то говорю неверно, с теорией у меня дела не особо, но на практике при работе с кодом проблем никаких)
@Dmytro-Tsymbaliuk2 жыл бұрын
is это для сравнения адресов переменных
@Cent72984 Жыл бұрын
Скорее всего это происходит из за оператора переполнения, int имеет максимальное значение 32к c копейками, переход за пределы данного количества, видимо происходят дополнительные операции, поэтому и имеем отличающиеся id.
@ВладДунаев-д5ъ2 жыл бұрын
Я этого не знал. Большое спасибо.
@zproger2 жыл бұрын
Рад что было полезно!
@MrYuriyP2 жыл бұрын
True или False в выражениях сравнения вообще не нужны. Достаточно написать if a: Выражение if a is True: имеет смысл только когда мы не уверены в типе переменной a.
@zproger2 жыл бұрын
Это да, но думаю не зря показал, так как уже лучше это, чем если будут писать if a == True
@sashikshik2 жыл бұрын
Спасибо, до видео вообще не слышал про этот оператор)
@zproger2 жыл бұрын
=)
@user-hammer19742 жыл бұрын
Столкнулся не знал. Понял что связано с количеством бит. Но не знал что это хранится по адресам и тем более не знал что от -5 до 256. Спасибо за ролик. Ох уж этот оператор is , то является , то не является. Вывод строки всяко будут не равны. Значения надо проверять через id.
@enrewardronkhall8340 Жыл бұрын
не знаю какую версию интерпретатора вы используете, но на 3.9 у меня не получилось повторить ваши результаты.
@techgregory52532 жыл бұрын
У меня нестандартный вопрос, почему выбрал Zorin OS для программирования, а не, например, Mint?
@zproger2 жыл бұрын
Потому что он визуально лучше, видео более комфортно будет смотреть когда красивый интерфейс :)
@techgregory52532 жыл бұрын
@@zproger я так и подумал) Но спросил на всякий случай, вдруг разница не только в интерфейсе
@Dmytro-Tsymbaliuk2 жыл бұрын
@@techgregory5253 разницы никакой
@Igrok_x_xp2 жыл бұрын
Это, как я слышал, из-за того, что при запуске программы питон инициализирует числа от 0 до 256(255) для ускорения работы.
@sxnity68082 жыл бұрын
От -5 до 255 =)
@loafius2 жыл бұрын
@@sxnity6808 почему именно от -5? Как я понимаю, это должно быть привязано к байту (0-255), но почему сверху насыпали ещё чисел?
@Dmytro-Tsymbaliuk2 жыл бұрын
@@loafius как говорят "питон изичный язык", а как начинаешь разбираться, так подводных камней намного больше, чем в плюсах
@Drip_harden2 жыл бұрын
do more of this!! this is amazing
@nameless6529 Жыл бұрын
Спасибо, очень понятно.
@AntonNovikov-d2u2 жыл бұрын
Привет, напомни, что за оболочка для python в терминале?
@zproger2 жыл бұрын
bpython
@dealingounces67152 жыл бұрын
Интересное видео) спасибо
@zproger2 жыл бұрын
Круто, рад что понравилось!
@GoldoEb2 жыл бұрын
Из вашего объяснения показалось, что is - это бесполезный синтаксический мусор. Проверять, что значение true/false можно просто в if-statement без всякого is. Как я понял, фишка is в том, чтобы сравнить ссылки на объекты без использования id(a) == id(b) и всё.
@АлексейШатиров-о8ж2 жыл бұрын
Не мусор. Когда пишешь свои классы, поведение == можно переопределить, а is всегда будет проверять, что в двух переменных один и тот же объект
@GoldoEb2 жыл бұрын
@@АлексейШатиров-о8ж а при чём тут классы? Как я понимаю, это единственно верное применение is проверить, что переменные ссылаются на одни и те же данные.
@Dmytro-Tsymbaliuk2 жыл бұрын
is это, в общем то, как &a == &b(взятие адреса переменной) в сишке, только из-за динамической типизации свои приколы вылазят из-за этого
@sergey85132 ай бұрын
С помощью is делается 2 вещи: 1) проверка тот ли это обьект 2) проверка является ли обьект того типа что нужен
@debian_rangerit47042 жыл бұрын
Я не могу понять у тебя панель задач из kde, а консоль из gnome, какое у тебя окружение?
@zproger2 жыл бұрын
Это zorin os core, у них это из коробки
@АлексейЛавренович-х7е2 жыл бұрын
Я вижу тут много кто говорит насчёт использования маленьких чисел и оптимизации кода относительно этого, типа поэтому диапазон от -5 до 256. У меня есть другое предположение: что насчёт байткода? Если посмотреть на дизассемблированный скрипт через dis, можно заметить, что местные команды как раз имеют порядковые номера, умещающиеся в байт. Это как-то связано с этим или я ошибаюсь?
@ВиталийКоновалов-г1ц2 жыл бұрын
спасибо! для меня это было ново!
@zproger2 жыл бұрын
Рад что видео принесло пользу :)
@master89202 жыл бұрын
Спс теперь понятно что is не для строк, чисел и тд., Да и вообщем я не знал почти все 😆 Спасибо за годный контент пока что такого подробного контента, я не встречал 🔥
@zproger2 жыл бұрын
Рад что понравилось, буду стараться и дальше :)
@flueriexeflueriexe70402 жыл бұрын
А вот подскажите, правильно ли я понял, если я сделаю так: Gribok is Supermario, а мне выдает значение True, где вот ошибка?? Ведь грибок не есть супермарио, в игре, где ты типа грибок и прыгаешь по супермарио
@zproger2 жыл бұрын
Если Gribok меньше 256, то будет True :D
@barboss66442 жыл бұрын
Неужто отсылка на Окси?
@myhinet98942 жыл бұрын
Окси?
@izumrita56943 ай бұрын
Спасибо за видео!
@bagamax2 жыл бұрын
Ну да, сначала визионеры щебечут про то, что явное лучше неявного, а простое сложного, а потом у разных переменных одинаковые йд и присвоение списка создаёт ссылки с обратной силой. Збсь, чё.
@zproger2 жыл бұрын
Бывает))
@РомановАндрей-х2д2 жыл бұрын
Хотел купить курс на степике, но не смог, так как он - в долларах, не проходит операция :(
@zproger2 жыл бұрын
Ага, из-за санкций временно нельзя купить, но можете отписать мне на почту (zproger777@gmail.com), что-то придумаем
@BlindKick2 жыл бұрын
Интересный такой вопрос, почему в REPL, is работает иначе, даже введя числа больше 256, он будет показывать True?
@lilproskater_2 жыл бұрын
Если не ошибаюсь, Питон для оптимизации заранее создает в памяти числа от 0 до 255 так как они используются чаще всего и чтобы постоянно не выдялять память это сделано как оптимизация. Из-за того что int - immutable можно и не беспокоиться о том что зачение может поменять другая переменна. Ответил до твоего ответа, предположение :) UPD: Посмотрел ответ автора, немного ошибся с range'ом заранее выдляемых чисел 😁 Спасибо за напоминание
@TeslaDln2 жыл бұрын
А в каком случае нужно об этом беспокоиться, когда ты в какую-то определенную ячейку памяти записал данные и по какой-то причине они тебе нужны из той же ячейки даже после удаления переменной?
@mak322 жыл бұрын
Знал про ссылки и списки, но то что is работает имеено так, никогда не задумывался
@zproger2 жыл бұрын
бывает :))
@AA-zk1si2 жыл бұрын
я не знал. интересненько!
@zproger2 жыл бұрын
Рад что понравилось :)
@mikhailyagodin841 Жыл бұрын
При изучении любого языка программирования следует читать стандарт языка про операторы присваивания, сравнения, is и прочее. Ну и язык... В 2023 году я не хочу этим заморачиваться и поэтому не программирую на Пайтоне.
@demg7738 Жыл бұрын
"IS" - это проверка ID объектов на равенство, то есть: id(obj_1) == id(obj_2) В 99% случаев (НИКОГДА) не следует заменять проверку равенства объектов этой операцией, т.к. это очень сильно зависит от реализации интерпретатора и системы!
@Ameta19962 жыл бұрын
В "стандартном Python" - всё нормально с id и ограничений на -5 и т.д. нет
@non53092 жыл бұрын
спасибо, интересно
@zproger2 жыл бұрын
рад что понравилось
@yarigosy2 жыл бұрын
Почему, когда присваиваешь значение в пределах зарезервированного диапазона *a = 5, b = 5,* при присваивании *b = 10* значение переменной *a* не становится равной *10,* ведь у этих переменных одинаковые *id?*
@supremo56452 жыл бұрын
потому что int - неизменяемый тип данных
@skeypro99302 жыл бұрын
Потому что есть такое понятие, как изменяемые типы и неизменяемые. Например, int и str относятся к неизменяемым типам. Легко понять на примере: a = 5 # создается ссылка на значение 5 в памяти a += 10 # создается ссылка на значение 15 в памяти, при этом значение 5 также остается в памяти, но теперь его никто не использует (ни одна переменная на него не ссылается), но оно не изменилось и осталось лежать в памяти. Также работает и со строками. При сложении строк создается новая строка, а не изменяется старая. Поэтому в твоем примере получается так, что изначально на значение 5 ссылается две переменных, но потом переменная b начинает ссылаться на значение 10, при этом значение 5 никак не изменяется, потому что это неизменяемый тип данных, соответственно после этого у тебя две переменные ссылаются на разные значения. А изменяемые типы данных это списки, например, как и было показано в видео. Потому что список в памяти изменяется, а не создается каждый раз новый) Надеюсь понятно объяснил)))
@vaccino36682 жыл бұрын
потому что b будет на другой участок памяти указывать уже
@Dmytro-Tsymbaliuk2 жыл бұрын
@@skeypro9930 ужас, в сишке просто бы добавило по тому же адресу
@hilsic Жыл бұрын
А зачем прописывать условие if a is True:..., когда можно просто указать if a:.... ?
@valeraussuriysk Жыл бұрын
версия 3.11.1 (дата релиза версии вроде-бы февраль 2023) пробовал вставить значения a и b = 99999999999999999999999999999999999999999999999999999999999999999999 Присваивается одинаковый id, и естественно: a is b = true
@scanvinlav2 жыл бұрын
Вы следующей ячейке, вы переменной, вы итоге..... Почему ты вЫкаешь, а не говоришь В переменной, В ячейке?
@zproger2 жыл бұрын
не знаю =)
@lowfolen98272 жыл бұрын
Найс кликбэйт превьюшка, но ролик так или иначе +- полезный.
@zproger2 жыл бұрын
Благодарю ;D
@user-buser_eto_ja2 жыл бұрын
Отличный материал
@zproger2 жыл бұрын
Спасибо за поддержку
@FXUNDPLXGG2 жыл бұрын
О, а как ты сделал подсказки в интерпретаторе питона? P.S: спасибо что пояснил за is
@zproger2 жыл бұрын
Я ничего не делал, оно по умолчанию так :) Это bpython
@X3osha2 жыл бұрын
В sublime text это плагин anaconda
@teeshqa2 жыл бұрын
Спасибо за видео! А на какой ОС вы работаете? Дизайн очень сочный у неё.
@zproger2 жыл бұрын
Zorin OS
@jackpraid77102 жыл бұрын
Дай угадаю: Первые числа меньше 255 и умещаются в один байт?
@zproger2 жыл бұрын
Да =)
@Тактиль2 жыл бұрын
4:44 - Что-то я такое и думал, что в непонятно чём хранится размер числа или слова(в данном случае в ячейке находится число или слово), и если написать больше, чем ячейка может вместить в себя, то остаток она разбивает на другую ячейку, и получаются разные значения
@andreymishuk21882 жыл бұрын
Очень годный контент, почему так мало лайков собираем?!? А ну-ка.... Ыть...)
@zproger2 жыл бұрын
:)))
@alexanderoverchenko5770 Жыл бұрын
А зачем в if использовать конструкцию типа "if a==True:", если можно просто написать "if a:" ?
@invinciblecame7336 Жыл бұрын
Всегда удивляло как некоторые выдумывают себе проблемы и героически с ними борются. Не используй то, в чем не разобрался, особенно когда есть более простой и эффективный аналог.
@dmitryowdienko3920 Жыл бұрын
За значения выше 255 не знал. Но тема не новая, так как вместо указателей у нас по сути референсы - то же, что и в плюсах, только более неявно, там хоть амперсанд при объявлении написать нужно, а тут "специфика языка". Нужно было скорее всего для экономии на копировании. Кстати, в 2.х и 3.х одинаково работает? Проверять лень.
@alekseystepanov38527 ай бұрын
Я ещё знал про такое слово, как "интернирование"...
@Ruslan5012 жыл бұрын
Не знал, спасибо!
@zproger2 жыл бұрын
Пожалуйста =)
@mlr__roal_68672 жыл бұрын
Во блин. Спасибо большое. Но откуда ты это все знаешь?
@zproger2 жыл бұрын
Читаю много контента по Python и собираю его в копилку :)
@7IdE2 жыл бұрын
"Так почему же именно от -5 до 256? Сейчас объясню". И не объяснил. Норм так.
@zproger2 жыл бұрын
Объяснил, потому что Python резервирует стандартные значения
@7IdE2 жыл бұрын
@@zproger , вопрос не в том, есть оно или нет. А в том, как ты сам и сформулировал: "почему не до 1000?". Или "почему не от -256 до 256"? Или "почему не с -6 до 256"?
@zproger2 жыл бұрын
Ну так я ведь после этого и сказал что для зарезервированных значений хватает 256, нет смысла выделять больше
@7IdE2 жыл бұрын
@@zproger, и до сих пор нет ответа. Почему именно такие значения. Почему не -4? Нам где-то нужно именно -5? И почему 256? Где объяснение необходимости КОНКРЕТНЫХ граничных условий?
@agweprint272 жыл бұрын
Наверное до 256 ссылки будут равны, потом нет
@zproger2 жыл бұрын
Можно и так сказать =)
@CheatCraft2 жыл бұрын
Что за шелл используется?
@CheatCraft2 жыл бұрын
Для автокомплита
@zproger2 жыл бұрын
bpython
@CheatCraft2 жыл бұрын
@@zproger спасиб
@gigarf22 жыл бұрын
проверил на 3.10 питоне тему с а = 1000 b = 1000, a is b выдал true. проверка не в консоли естесно. Более того при выполнении написанного скрипта через cmd командой "python main.py" все равно выдает true. Если не сложно можешь ответить в чем именно причина чтоб погуглить это и почитать как так получается?
@survpavlov7426 Жыл бұрын
Сам же ответил - потому как не в консоли. Вообще все видео про консоль, к реальным скриптам не имеет отношение.
@mikema______11702 жыл бұрын
Не "в памяти выделяется строка", а "память выделяется под хранение строки"
@palyaros022 жыл бұрын
А что за интерпретатор такой прокачанный с подскасками?
@zproger2 жыл бұрын
bpython
@timofeybelyakov7752 Жыл бұрын
Для pycharm не актуально: id всегда одинаковые для равных значений. Однако для дефолтной питоновской idle всё, как на видео.
@tolikbegyn99992 жыл бұрын
Почему при редактировании значения одной переменной не меняется значение во второй, ссылающейся на то же число, как это происходит с массивами?
@huseeads2 жыл бұрын
int неизменяемый тип данных
@ЙенФенФыр2 жыл бұрын
Так почему от -5 до 256? Объяснения в итоге не было. То, что True и False вписываются в этот промежуток, ничего не значит. Мало ли, что ещё туда вписывается, да и число 256 тогда совершенно избыточно. И как бы NoneType вообще не является подтипом целых чисел, чтобы хоть как-то определять размер массива, созданного для хранения целых чисел. Кто знает.... может быть.... оператор is прекрасно работает с True, False и None, потому что все эти объекты существуют в программе в единственном экземпляре? И ссылки на них, соответственно, всегда одинаковые?
@flueriexeflueriexe70402 жыл бұрын
А ещё у меня есть определенные вопросы к Вашему дистрибутиву....., а точнее, к его интерфейсу