Оператор "is" Python сложнее, чем вы думаете

  Рет қаралды 98,369

ZProger [ IT ]

ZProger [ IT ]

2 жыл бұрын

⭐ Курс ООП и Приват канал: www.zproger-school.com/?...
⭐ Телеграм канал: t.me/+xhecBmnnjHI0MzZh
Подводные камни оператора is, которые могут вас удивить.
Многие используют оператор "is" для сравнения значений, но не все знают, что это может вызвать огромное количество багов, если не знать о его особенностях, которые рассматриваются в данном видео.
Мы также рассмотрим примеры, где его точно не следует применять и узнаем о том, почему именно он вызывает подобные баги и как это работает на более низком уровне.
📁 Github: github.com/Zproger
📁 Все плейлисты с уроками: bit.ly/39GaY89
📁 Связаться со мной: zproger777@gmail.com
📁 Поддержать криптовалютой: github.com/Zproger/donate

Пікірлер: 390
@mpenzin
@mpenzin 2 жыл бұрын
Можно порекомендовать автору не напускать туману насчет "сложностей" оператора is, а начинать с главного - разницы между понятиями равенства (equals) и идентичности (identity), после этого вопросы и нюансы насчет того, когда какой использовать отпадает сам собой.
@Ivan_Balakirev
@Ivan_Balakirev 2 жыл бұрын
и еще, что объекты бывают изменяемые и нет и какие
@azerkoron
@azerkoron Жыл бұрын
Он одну и туже информацию повторяет раз по десять, добавляя немножко нового, это раздражает, ощущение что растянуть видео хочет
@imfiwile8995
@imfiwile8995 Жыл бұрын
@@azerkoron за видео короче 10 минут не платят деньги
@meetthespy3398
@meetthespy3398 Жыл бұрын
@@imfiwile8995 ни за какое видео не платят деньги, очнись
@shadowplay1211
@shadowplay1211 Жыл бұрын
Согласен, одна вода в видео
@EvgenijJobs
@EvgenijJobs 2 жыл бұрын
А теперь небольшой нюанс. Если писать не в консоли, где подтягивается только сам интерпретатор, а запускать скрипт, то все числовые значения будут иметь одинаковые адреса. Это связано с оптимизацией по памяти. Грубо говоря, 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-Tsymbaliuk
@Dmytro-Tsymbaliuk 2 жыл бұрын
Да, когда транслятор видит код целиком, то он бы в .exe файлах переменные с одинаковым значением занес бы в секцию .data(если константа, то в .rdata)
@dail4568
@dail4568 Жыл бұрын
"То все числовые значения будут иметь одинаковый адрес", нет не будут. Если вы не знаете python внутри то вот: по умолчанию, в питоне числа от -5 до 256(это можно настроить если вы сами компилируете свой питон) являются простыми числами(ну в исходниках они "small_int" и имеют 1 адрес.)
@tzn9597
@tzn9597 13 күн бұрын
Он говорил что если написать a = 1111 и b = 1111 в файле, то выведет True, так как у них одна и та же ссылка на pyobject, а в консоле как раз значения от -5 до 256. ​@@dail4568
@ValeriyLarin
@ValeriyLarin 2 жыл бұрын
Спасибо за доступное разъяснение. Жду новых видео)
@zproger
@zproger 2 жыл бұрын
Рад что понравилось
@5vFreeNz
@5vFreeNz 2 жыл бұрын
Шикарный канал! Живи, человек! Спасибо!
@zproger
@zproger 2 жыл бұрын
Рад был помочь :)
@user-gk6ul4jf9m
@user-gk6ul4jf9m 2 жыл бұрын
Спасибо, за полезную информацию!)
@zproger
@zproger 2 жыл бұрын
Пожалуйста :)
@ViktorTolmachev
@ViktorTolmachev Жыл бұрын
Спасибо, видео полезное!
@user-hk2ov9ky5q
@user-hk2ov9ky5q 2 жыл бұрын
Вау, не знал об этом, спасибо за новую информацию!
@zproger
@zproger 2 жыл бұрын
Рад что было полезно :)
@user-yv4pu6jv5i
@user-yv4pu6jv5i 2 жыл бұрын
😶‍🌫️
@kequing792
@kequing792 Жыл бұрын
Тимофей, прошло 8 месяцев, как ты начал изучать Пайтон, чего добился ?
@user-of-world
@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" для сравнения таких переменных. Проблемы с изменяемыми объектами: Если вы изменяете изменяемый объект, на который указывают две переменные, это может привести к непредвиденным результатам, если вы не ожидаете, что эти переменные указывают на один и тот же объект в памяти. В таком случае следует использовать копирование объекта, чтобы создать новый объект, а не изменять существующий объект.
@user-yf3xe7ku8b
@user-yf3xe7ku8b 6 ай бұрын
Спасибо!
@stanislav_laptenok
@stanislav_laptenok 7 ай бұрын
Спасибо за видео , очень полезно
@nameless6529
@nameless6529 Жыл бұрын
Спасибо, очень понятно.
@user-hf1hp7mq5c
@user-hf1hp7mq5c 2 жыл бұрын
Отличный материал, успехов вам
@zproger
@zproger 2 жыл бұрын
И вам успехов :)
@user-nh9gn2ql8x
@user-nh9gn2ql8x 2 жыл бұрын
Для опытного может показаться фигней эта инфа, но для такого новичка, как я, эта инфа была довольно интересной и крайне полезной. Теперь, если буду сравнивать переменные с bool-значениями, то буду использовать оператор "is", а не двойное равно. Лайк для видео!
@ivkrak8258
@ivkrak8258 Жыл бұрын
Не сравнивай, а просто пользуйся тем, что оператор «if» работает только при истинном выражении. if a == True --> if a
@gfhhg-hfsvbufxv-jyxbn
@gfhhg-hfsvbufxv-jyxbn 2 жыл бұрын
Очень круто! Спасибо, я не знал!
@zproger
@zproger 2 жыл бұрын
Рад что понравилось :)
@Taron8117
@Taron8117 Жыл бұрын
Спасибо за подробности. Посмотрел несколько видео и только у Вас подробно о том, почему так
@dealingounces6715
@dealingounces6715 2 жыл бұрын
Интересное видео) спасибо
@zproger
@zproger 2 жыл бұрын
Круто, рад что понравилось!
@anri_khv
@anri_khv Жыл бұрын
Очень полезная информация, простым языком на понятных примерах, подпишусь!!!
@flueriexeflueriexe7040
@flueriexeflueriexe7040 2 жыл бұрын
Но спасибо Вам за Ваши старания!!!!! Ждём новых видео!!!!
@zproger
@zproger 2 жыл бұрын
Спасибо :)
@CastilloJKD
@CastilloJKD Жыл бұрын
do more of this!! this is amazing
@loktarogar6017
@loktarogar6017 2 жыл бұрын
Годний контент, лайк 👍
@zproger
@zproger 2 жыл бұрын
Благодарю
@logitec1994
@logitec1994 Жыл бұрын
Вся информация полностью новая, спасибо)
@P0dCasts.io6o
@P0dCasts.io6o Жыл бұрын
Не знал. Спасибо авторам!
@zproger
@zproger Жыл бұрын
=)
@wtfmaruni
@wtfmaruni 2 жыл бұрын
Первый месяц как начал изучать Python, твой канал супер!
@zproger
@zproger 2 жыл бұрын
Благодарю!
@whoareyou8480
@whoareyou8480 2 жыл бұрын
Если переменная (допустим а) проверяется в 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]] Потому что а - список, членами которого являются три одинаковых ссылки на один и тот же объект списка
@tohoto2183
@tohoto2183 2 жыл бұрын
Это вообще мало кто использует , такая дичь вообще легко забывается ,а значит в питоне под запретом.
@fish9370
@fish9370 Жыл бұрын
Тем, кто пришел из других языков, волосы дыбом становятся от таких возможностей. Я в шоке
@mcomponent
@mcomponent 2 жыл бұрын
Драсьте, расскажите про Cython и Ctypes в планах оптимизации, если можно. Вкратце, Python хорошо контактирует с C и C++ и это часто используется в целях оптимизации. Cython - отдельная надстройка над питоном в виде модуля, которая позволяет компилировать дополненный синтаксис в C. А ctypes позволяет загружать и связывать DLL и Shared библиотеки в Python, это выглядит примерно так же, как динамическая подгрузка в C (если вы занимались этим когда нибудь). Ctypes быстрее, но поддерживать трудно. Cython медленнее, в некоторых ситуациях он даже даёт лишнее время выполнение по сравнению с обычным питоном, ведь вся оптимизация в основном построена на статической типизации, но поддержка проще и быстрее. Cython ещё можно распространять в виде пакета PyPI.
@user-ec8pl8gn4f
@user-ec8pl8gn4f 2 жыл бұрын
Я этого не знал. Большое спасибо.
@zproger
@zproger 2 жыл бұрын
Рад что было полезно!
@bronis_lav
@bronis_lav 2 жыл бұрын
Питон для оптимизации, значения размером с байт хранит в одном экземпляре. Есть локальные константы и если вы поменяете значение, то поменяется просто ссылка на другую константу. Небольшие значения используются часто и вполне логично, зачем в памяти размещать отдельную ячейку если такая уже есть. Поэтому все значения вписывающиеся в размер байта ссылаются на константы. Питон проверяет, если объявленная вами переменная имеет значение от 0 до 255, то производится проверка, если такое значение есть в локальных переменных, то оно просто ссылается на него, если нету, то создается новая константа. Но если значение больше 255 то под новую переменную выделяется память. По такому принципу работают виртуальные машины вроде JVM но вообще со всеми типами данных, не то чтобы я спец по питону или шибко догадливый xD Проблема тут не в операторе is, подобные есть во многих языках, а в "программистах" не знающих как оператор работает или не понимающих разницу между ссылкой на ячейку памяти и значением в памяти. Зачем городить такое видео, если просто очевидно есть операторы сравнивающие ссылки, а не данные.
@user-pz9ju6ss7r
@user-pz9ju6ss7r 2 жыл бұрын
а вы случайно не знаете откуда берётся нижняя граница -5? Гугл не помог мне с поиском этой информации. Есть записи в духе "так оптимально!", но почему именно начинать с -5 - это оптимально не говорят
@TeslaDln
@TeslaDln Жыл бұрын
@@user-pz9ju6ss7r. Видимо для пользователя Nelsy это видео "просто очевидно", а Ваш вопрос нет.
@user-gz4fx4sv6d
@user-gz4fx4sv6d 2 жыл бұрын
Спасибо большое
@user-vl1el8bp7y
@user-vl1el8bp7y 2 жыл бұрын
спасибо! для меня это было ново!
@zproger
@zproger 2 жыл бұрын
Рад что видео принесло пользу :)
@AA-zk1si
@AA-zk1si 2 жыл бұрын
я не знал. интересненько!
@zproger
@zproger 2 жыл бұрын
Рад что понравилось :)
@user-buser_eto_ja
@user-buser_eto_ja 2 жыл бұрын
Отличный материал
@zproger
@zproger 2 жыл бұрын
Спасибо за поддержку
@Ruslan501
@Ruslan501 2 жыл бұрын
Не знал, спасибо!
@zproger
@zproger 2 жыл бұрын
Пожалуйста =)
@ncertus
@ncertus 9 ай бұрын
Это видео должно быть не об операторе "is" - с ним никаких проблем нет. Вся суть в переменных python, вернее в их отсутствии. Каждая "переменная" это "имя" ссылающееся на PyObject с типом данных, счетчиком ссылок и значением. Тут надо помнить, что большинсво типов - неизменяемы, т.е. меняя значение переменной с любым типом, кроме словаря, списка или множества, мы создаем новый PyObject. "is" возвращает "true" из-за peephole-оптимизации в Cpython, которая старается интернировать повторяющееся объекты.
@non5309
@non5309 2 жыл бұрын
спасибо, интересно
@zproger
@zproger 2 жыл бұрын
рад что понравилось
@__s__a__b__i__r__
@__s__a__b__i__r__ 2 жыл бұрын
Просьба снимать похожие видосы, всё по порядку объяснил , спасибо
@zproger
@zproger 2 жыл бұрын
Круто, буду стараться делать подобные видео =)
@s.a.khramov
@s.a.khramov 2 жыл бұрын
Спасибо!
@zproger
@zproger 2 жыл бұрын
:)
@WHT_-ue2rl
@WHT_-ue2rl 2 жыл бұрын
Очень прикольное видео. Слава Богу, что наткнулся на твоё видео, а то пихал этот бедный is куда не попадя))) Правда потом использовал только оператор равенства Лайк! И подписка конечно же!
@zproger
@zproger 2 жыл бұрын
Благодарю, рад что помогло
@programming_etc
@programming_etc Жыл бұрын
Годнота. Кстати какую систему юзаешь? Если не ошибаюсь, это же федора?
@zproger
@zproger Жыл бұрын
Zorin OS
@anty1101
@anty1101 Жыл бұрын
Спасибо за видео, познавательно. А из комментов узнал ещё больше.
@zproger
@zproger Жыл бұрын
Это хорошо
@flueriexeflueriexe7040
@flueriexeflueriexe7040 2 жыл бұрын
Здравствуйте, спасибо за видео! Мне понравилось! Я, правда, ничего не понял, но очень интересно
@zproger
@zproger 2 жыл бұрын
хаха)
@user-mg9km7hh1j
@user-mg9km7hh1j 2 жыл бұрын
Дякую! Цікаве та корисне відео!
@zproger
@zproger 2 жыл бұрын
Благодарю :)
@artembagachkov933
@artembagachkov933 2 жыл бұрын
Вау, ты всегда объясняешь быстро, глубоко и понятно, а не так как множество блогеров, что только поверхностно затронут тему, и будут лить воду 10 минут
@zproger
@zproger 2 жыл бұрын
Круто, спасибо :)
@zzzzzzzz6792
@zzzzzzzz6792 2 жыл бұрын
@@zproger это сарказм, бро
@user-ig5qe8sy9b
@user-ig5qe8sy9b 2 жыл бұрын
@@zzzzzzzz6792 учитывая что это подписчик думаю нет
@nikipinki6554
@nikipinki6554 Жыл бұрын
крутяк спс
@user-ii2hp9tp1z
@user-ii2hp9tp1z 2 жыл бұрын
Я вижу тут много кто говорит насчёт использования маленьких чисел и оптимизации кода относительно этого, типа поэтому диапазон от -5 до 256. У меня есть другое предположение: что насчёт байткода? Если посмотреть на дизассемблированный скрипт через dis, можно заметить, что местные команды как раз имеют порядковые номера, умещающиеся в байт. Это как-то связано с этим или я ошибаюсь?
@al_xy
@al_xy 2 жыл бұрын
Странный вопрос, но может быть ты или другой опытный человек, мог бы помочь мне определиться в сложившемся положении, буду крайне благодарен) Мне 20 лет, на данный момент учусь на 2 курсе в вузе, на прогера. Изучаем почти всё, что касается: базы данных, фронтенд, немного был геймдев, машинное обучение, собственно сам кодинг на C#, на следующем курсе будет бэкенд и т.д. Изначально я хотел посвятить себя самообучению 3D графике и дизайну, т.к., но семья убедила пойти в вуз. И вот, уже к концу 1 курса я начал отставать от учебной программы, т.к. пропадал интерес и желание, плюс я долго болел ковидом, возможно из-за того, что в вузе вместо настоящего программирования, дают всякие курсовые работы и кучу ненужной воды (сейчас я достаточно сильно отстал от программы). Останавливает меня от отчисления мысль о возможности получения диплома ВО в сфере кодинга и геймдева (что возможно было бы полезно для карьеры в 3D). Быть 3д художником, честно говоря хочется больше, чем прогером, мне нужно решить, отчисляться и вливаться в 3D, или упорно всё свободное время тратить, чтобы догнать учебную программу, закончить вуз и получить этот диплом (даже не знаю, стоит ли это того). Место проживания также играет значительную роль, ведь программисту 100% будет легче найти работу в регионе, да и, наверное, в принципе, в России... P.S. Моделировать, фотошопить, создавать что-то, креативить, заниматься творчеством, я делаю это в первую очередь из интереса, а программирование, наверное (это не точно), финансово выгодно и крайне актуально, не требует мощного железа, можно работать хоть в деревне, хоть на луне, и на обычном ноутбуке, а для того же 3д нужна мощная станция, это проблема для мобильности, да и стоит она не мало. Как один из факторов, учёба не дешёвая, эти деньги семья могла бы потратить на более важные нужды, я не очень понимаю, стоит ли оно того Отчислятся также обидно т.к. это моё первое образование, и получается, если отчислюсь, стану ненужным самоучкой (так говорят родители), в то время, как все остальные знакомые получат дипломы и станут квалифицированными спецами И небольшой вопрос, не по теме: Стоит ли покупать ноут или лучше вложиться в улучшение пк (мой пк: 16 гб, 1660S, i5 6600)?
@user-sf3vd8gr5x
@user-sf3vd8gr5x Жыл бұрын
Никогда не использовал is для сравнения строк и чисел, но спасибо за информацию. Очень любопытно.
@zproger
@zproger Жыл бұрын
=))
@sashikshik
@sashikshik 2 жыл бұрын
Спасибо, до видео вообще не слышал про этот оператор)
@zproger
@zproger 2 жыл бұрын
=)
@user-lw2cf1ft1k
@user-lw2cf1ft1k 2 жыл бұрын
b += 'o' ==> b = b + 'o' ==> сначала высчитывается правая сторона, получается новый объект и новая ссылка на него.
@zproger
@zproger 2 жыл бұрын
Интересно
@master8920
@master8920 2 жыл бұрын
Спс теперь понятно что is не для строк, чисел и тд., Да и вообщем я не знал почти все 😆 Спасибо за годный контент пока что такого подробного контента, я не встречал 🔥
@zproger
@zproger 2 жыл бұрын
Рад что понравилось, буду стараться и дальше :)
@tinylith1603
@tinylith1603 2 жыл бұрын
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
@zproger
@zproger 2 жыл бұрын
+1 странность :D
@A5ter
@A5ter 2 жыл бұрын
Не представляю каким образом за 5 лет кодерства я не столкнулся с потребностью копировать списки. Да, я не знал про эту примитивщину. О_о Спасибо!
@zproger
@zproger 2 жыл бұрын
Бывает) Тут ещё очень много таких подвохов, знать о всех сразу нереально
@Fluery-9106
@Fluery-9106 2 жыл бұрын
@@zproger в питоне это явно более реально, нежели в JS, где всяких неявных преобразований дохренилион с лишним)
@artyom_trustee
@artyom_trustee 2 жыл бұрын
как можно кодить 5 лет и не знать как работает память?
@Dmytro-Tsymbaliuk
@Dmytro-Tsymbaliuk 2 жыл бұрын
@@Fluery-9106 это намного явнее, если использовать язык с явными указателями, там такой вопрос как-то не возникает, ибо и так все понятно
@taee1938
@taee1938 2 жыл бұрын
@@artyom_trustee так он питонист)
@NarkotikAsd
@NarkotikAsd 2 жыл бұрын
Спасибо.
@zproger
@zproger 2 жыл бұрын
И вам спасибо за поддержку :)
@vayer6445
@vayer6445 2 жыл бұрын
Спасибо большое ,вчера мудохался с парсером и думал в чём проблема ,а вот она оказывается.)
@zproger
@zproger 2 жыл бұрын
Рад что помогло =)
@user-nf5vc6uj3s
@user-nf5vc6uj3s 2 жыл бұрын
Интересный такой вопрос, почему в REPL, is работает иначе, даже введя числа больше 256, он будет показывать True?
@whale5219
@whale5219 2 жыл бұрын
Строки это неизменяемый тип данных и в данном примере просто создается новый объект с тем же именем в другой ячейке памяти. Списки же наоборот являются изменяемыми от чего id и не меняется.
@alekseystepanov3852
@alekseystepanov3852 2 ай бұрын
Я ещё знал про такое слово, как "интернирование"...
@user-tl8gk3dy3r
@user-tl8gk3dy3r Жыл бұрын
Спасибо за разъяснение. Всё хорошо, но музыка лишняя.
@eg0or499
@eg0or499 Жыл бұрын
Ребят, поправьте меня я только начал изучать пайтон. В 6:09 ты говоришь, что сложно это понять. Строке hell присваивается новый айди из-за того, что строки являются неизменяемыми типами(это написано в любом учебнике по пайтон на первых страницах )данных и по сути когда к hell ты добавил o, пайтон затер строку hell и создал новую строку с соответственного новой ссылкой и на ячейку памяти. Это не флейм не упрек. Так классные видосы я смотрю тебя
@enrewardronkhall8340
@enrewardronkhall8340 11 ай бұрын
не знаю какую версию интерпретатора вы используете, но на 3.9 у меня не получилось повторить ваши результаты.
@Dmitriitube
@Dmitriitube 10 ай бұрын
Ну и почему кэшируются значения от -5 до 256? Почему были выбраны именно такие значение?
@mrdixioner
@mrdixioner Ай бұрын
Тоже не услышал ответа.
@user-hs1ih1mp6y
@user-hs1ih1mp6y 2 жыл бұрын
4:44 - Что-то я такое и думал, что в непонятно чём хранится размер числа или слова(в данном случае в ячейке находится число или слово), и если написать больше, чем ячейка может вместить в себя, то остаток она разбивает на другую ячейку, и получаются разные значения
@bagamax
@bagamax 2 жыл бұрын
Ну да, сначала визионеры щебечут про то, что явное лучше неявного, а простое сложного, а потом у разных переменных одинаковые йд и присвоение списка создаёт ссылки с обратной силой. Збсь, чё.
@zproger
@zproger 2 жыл бұрын
Бывает))
@user-iq9tt3me9b
@user-iq9tt3me9b Жыл бұрын
Столкнулся не знал. Понял что связано с количеством бит. Но не знал что это хранится по адресам и тем более не знал что от -5 до 256. Спасибо за ролик. Ох уж этот оператор is , то является , то не является. Вывод строки всяко будут не равны. Значения надо проверять через id.
@axathearcticfox5514
@axathearcticfox5514 2 жыл бұрын
Спасибо! 1.5 часа парился с хрена ли "i^m" не равно "i^m". Не понимал какого хрена это так работает. Теперь мне стало понятней.
@zproger
@zproger 2 жыл бұрын
круто =)
@Cent72984
@Cent72984 Жыл бұрын
Скорее всего это происходит из за оператора переполнения, int имеет максимальное значение 32к c копейками, переход за пределы данного количества, видимо происходят дополнительные операции, поэтому и имеем отличающиеся id.
@mlr__roal_6867
@mlr__roal_6867 2 жыл бұрын
Во блин. Спасибо большое. Но откуда ты это все знаешь?
@zproger
@zproger 2 жыл бұрын
Читаю много контента по Python и собираю его в копилку :)
@scanvinlav
@scanvinlav 2 жыл бұрын
Вы следующей ячейке, вы переменной, вы итоге..... Почему ты вЫкаешь, а не говоришь В переменной, В ячейке?
@zproger
@zproger 2 жыл бұрын
не знаю =)
@normpochan
@normpochan Жыл бұрын
В питоне же всё является объектами, в том числе и числа. Под первые (не помню сколько, но вроде в диапазоне 200-300) сразу выделяется память, независимо от того, используем мы их или нет. Таким образом, когда мы пишем a = 200, b = 200, мы просто создаём ссылку на объект числа 200. А когда создаём большую чиселку, мы каждый раз создаём новый объект? Правда хз, что мешает нам создать объект большого числа один раз, а потом просто ссылки создавать, но видимо какой-то сакральный смысл в этом есть) upd: Не знал, что не первые 2хх чисел, а в диапазоне от -5 до 256. Теперь буду, спасибо)
@user-ot7uu4il7u
@user-ot7uu4il7u 2 жыл бұрын
Привет, напомни, что за оболочка для python в терминале?
@zproger
@zproger 2 жыл бұрын
bpython
@tolikbegyn9999
@tolikbegyn9999 2 жыл бұрын
Почему при редактировании значения одной переменной не меняется значение во второй, ссылающейся на то же число, как это происходит с массивами?
@huseeads
@huseeads 2 жыл бұрын
int неизменяемый тип данных
@lilproskater_
@lilproskater_ 2 жыл бұрын
Если не ошибаюсь, Питон для оптимизации заранее создает в памяти числа от 0 до 255 так как они используются чаще всего и чтобы постоянно не выдялять память это сделано как оптимизация. Из-за того что int - immutable можно и не беспокоиться о том что зачение может поменять другая переменна. Ответил до твоего ответа, предположение :) UPD: Посмотрел ответ автора, немного ошибся с range'ом заранее выдляемых чисел 😁 Спасибо за напоминание
@TeslaDln
@TeslaDln Жыл бұрын
А в каком случае нужно об этом беспокоиться, когда ты в какую-то определенную ячейку памяти записал данные и по какой-то причине они тебе нужны из той же ячейки даже после удаления переменной?
@2Quard
@2Quard Жыл бұрын
При просмотре вспомнил указатели и ссылки в си-пи-пи
@user-ju7xj3qu6k
@user-ju7xj3qu6k 2 жыл бұрын
Коллеги, подобные "чудеса" случаются из-за небрежности в изучении семантики операторов. "Сравнение значений объектов"! и "Проверка идентичности объектов" -- разные операции и не взаимозаменяемые.
@gigarf2
@gigarf2 2 жыл бұрын
проверил на 3.10 питоне тему с а = 1000 b = 1000, a is b выдал true. проверка не в консоли естесно. Более того при выполнении написанного скрипта через cmd командой "python main.py" все равно выдает true. Если не сложно можешь ответить в чем именно причина чтоб погуглить это и почитать как так получается?
@survpavlov7426
@survpavlov7426 Жыл бұрын
Сам же ответил - потому как не в консоли. Вообще все видео про консоль, к реальным скриптам не имеет отношение.
@agweprint27
@agweprint27 2 жыл бұрын
Наверное до 256 ссылки будут равны, потом нет
@zproger
@zproger 2 жыл бұрын
Можно и так сказать =)
@FXUNDPLXGG
@FXUNDPLXGG 2 жыл бұрын
О, а как ты сделал подсказки в интерпретаторе питона? P.S: спасибо что пояснил за is
@zproger
@zproger 2 жыл бұрын
Я ничего не делал, оно по умолчанию так :) Это bpython
@X3osha
@X3osha 2 жыл бұрын
В sublime text это плагин anaconda
@mak32
@mak32 2 жыл бұрын
Знал про ссылки и списки, но то что is работает имеено так, никогда не задумывался
@zproger
@zproger 2 жыл бұрын
бывает :))
@debian_rangerit4704
@debian_rangerit4704 2 жыл бұрын
Я не могу понять у тебя панель задач из kde, а консоль из gnome, какое у тебя окружение?
@zproger
@zproger 2 жыл бұрын
Это zorin os core, у них это из коробки
@mikema______1170
@mikema______1170 Жыл бұрын
Не "в памяти выделяется строка", а "память выделяется под хранение строки"
@FsKir
@FsKir Жыл бұрын
Какой у тебя дистрибутив?
@zproger
@zproger Жыл бұрын
Zorin OS
@lowfolen9827
@lowfolen9827 2 жыл бұрын
Найс кликбэйт превьюшка, но ролик так или иначе +- полезный.
@zproger
@zproger 2 жыл бұрын
Благодарю ;D
@user-ti2jn7wy5v
@user-ti2jn7wy5v 2 жыл бұрын
Хотел купить курс на степике, но не смог, так как он - в долларах, не проходит операция :(
@zproger
@zproger 2 жыл бұрын
Ага, из-за санкций временно нельзя купить, но можете отписать мне на почту (zproger777@gmail.com), что-то придумаем
@user-og6vn2nz5j
@user-og6vn2nz5j 2 жыл бұрын
Я всем говорю, что питон сложнее ассемблера!
@zproger
@zproger 2 жыл бұрын
Учу сейчас ассемблер и это ад))
@7IdE
@7IdE 2 жыл бұрын
"Так почему же именно от -5 до 256? Сейчас объясню". И не объяснил. Норм так.
@zproger
@zproger 2 жыл бұрын
Объяснил, потому что Python резервирует стандартные значения
@7IdE
@7IdE 2 жыл бұрын
@@zproger , вопрос не в том, есть оно или нет. А в том, как ты сам и сформулировал: "почему не до 1000?". Или "почему не от -256 до 256"? Или "почему не с -6 до 256"?
@zproger
@zproger 2 жыл бұрын
Ну так я ведь после этого и сказал что для зарезервированных значений хватает 256, нет смысла выделять больше
@7IdE
@7IdE 2 жыл бұрын
​@@zproger, и до сих пор нет ответа. Почему именно такие значения. Почему не -4? Нам где-то нужно именно -5? И почему 256? Где объяснение необходимости КОНКРЕТНЫХ граничных условий?
@flueriexeflueriexe7040
@flueriexeflueriexe7040 2 жыл бұрын
А вот подскажите, правильно ли я понял, если я сделаю так: Gribok is Supermario, а мне выдает значение True, где вот ошибка?? Ведь грибок не есть супермарио, в игре, где ты типа грибок и прыгаешь по супермарио
@zproger
@zproger 2 жыл бұрын
Если Gribok меньше 256, то будет True :D
@barboss6644
@barboss6644 2 жыл бұрын
Неужто отсылка на Окси?
@myhinet9894
@myhinet9894 2 жыл бұрын
Окси?
@user-ph8fq5wq5z
@user-ph8fq5wq5z 2 жыл бұрын
Разные значение наступают при больших числах, однако при маленький до 250 они будут одинаковыми,
@justpret981
@justpret981 2 жыл бұрын
Я вообще не знал о таком операторе
@zproger
@zproger 2 жыл бұрын
теперь думаю есть представление =)
@christiansanta984
@christiansanta984 2 жыл бұрын
Нафига не знали)) откуда брать все эти ньюансы? Книги не предлагать))
@zproger
@zproger 2 жыл бұрын
Много материала нужно перебирать чтобы найти подобное :)
@sezamenko
@sezamenko 11 ай бұрын
Да это особенность питона, до определённого числа по-моему до 255 одинаковые значение имеют один и тот же адрес для оптимизации самого скрипта чтобы не создавать копию создаёться ссылка на значение
@kizik85
@kizik85 2 жыл бұрын
Изучаю Python, не знал, очень полезно! Спасибо автору видео!!!
@zproger
@zproger 2 жыл бұрын
Пожалуйста! Рад что помогло
@vladyslavbashtannyk9393
@vladyslavbashtannyk9393 Жыл бұрын
Круто! Цікаві факти!
@predatel_rodini
@predatel_rodini 2 жыл бұрын
Конечно я всё это знал. Любой нормальный чел, который учил путона это обязан знать.
@zproger
@zproger 2 жыл бұрын
это да
@flueriexeflueriexe7040
@flueriexeflueriexe7040 2 жыл бұрын
А ещё у меня есть определенные вопросы к Вашему дистрибутиву....., а точнее, к его интерфейсу
@zproger
@zproger 2 жыл бұрын
Нормальный интерфейс вроде как)
@MrYuriyP
@MrYuriyP 2 жыл бұрын
True или False в выражениях сравнения вообще не нужны. Достаточно написать if a: Выражение if a is True: имеет смысл только когда мы не уверены в типе переменной a.
@zproger
@zproger 2 жыл бұрын
Это да, но думаю не зря показал, так как уже лучше это, чем если будут писать if a == True
@kotenok6919
@kotenok6919 Жыл бұрын
А можно `a is int ` ?
@andreymishuk2188
@andreymishuk2188 2 жыл бұрын
Очень годный контент, почему так мало лайков собираем?!? А ну-ка.... Ыть...)
@zproger
@zproger 2 жыл бұрын
:)))
@user-ic6jp7je7c
@user-ic6jp7je7c 2 жыл бұрын
Я думал СиШарп самый запутанный с кучей условностей. Не-а...
@zproger
@zproger 2 жыл бұрын
Шарп вроде простой достаточно
@user-ic6jp7je7c
@user-ic6jp7je7c 2 жыл бұрын
@@zproger как и везде итерировать массив - легко, а потом пытаешься понять разницу между struct, immutable struct, record и всеми видами class'ов, например. Или что именно получается в IL. 🤯
@Dmytro-Tsymbaliuk
@Dmytro-Tsymbaliuk 2 жыл бұрын
@@user-ic6jp7je7c плюсы будут проще, я вполне серьезно
@yarigosy
@yarigosy 2 жыл бұрын
Почему, когда присваиваешь значение в пределах зарезервированного диапазона *a = 5, b = 5,* при присваивании *b = 10* значение переменной *a* не становится равной *10,* ведь у этих переменных одинаковые *id?*
@supremo5645
@supremo5645 2 жыл бұрын
потому что int - неизменяемый тип данных
@skeypro9930
@skeypro9930 2 жыл бұрын
Потому что есть такое понятие, как изменяемые типы и неизменяемые. Например, int и str относятся к неизменяемым типам. Легко понять на примере: a = 5 # создается ссылка на значение 5 в памяти a += 10 # создается ссылка на значение 15 в памяти, при этом значение 5 также остается в памяти, но теперь его никто не использует (ни одна переменная на него не ссылается), но оно не изменилось и осталось лежать в памяти. Также работает и со строками. При сложении строк создается новая строка, а не изменяется старая. Поэтому в твоем примере получается так, что изначально на значение 5 ссылается две переменных, но потом переменная b начинает ссылаться на значение 10, при этом значение 5 никак не изменяется, потому что это неизменяемый тип данных, соответственно после этого у тебя две переменные ссылаются на разные значения. А изменяемые типы данных это списки, например, как и было показано в видео. Потому что список в памяти изменяется, а не создается каждый раз новый) Надеюсь понятно объяснил)))
@vaccino3668
@vaccino3668 2 жыл бұрын
потому что b будет на другой участок памяти указывать уже
@Dmytro-Tsymbaliuk
@Dmytro-Tsymbaliuk 2 жыл бұрын
@@skeypro9930 ужас, в сишке просто бы добавило по тому же адресу
@pacifistrush680
@pacifistrush680 Жыл бұрын
Пул интов используется для маленьких значений
@user-hg3vy4qo1m
@user-hg3vy4qo1m Жыл бұрын
Потому что пул чисел. Ставьте лайки, подписывайтесь на канал
@teeshqa
@teeshqa 2 жыл бұрын
Спасибо за видео! А на какой ОС вы работаете? Дизайн очень сочный у неё.
@zproger
@zproger 2 жыл бұрын
Zorin OS
WHO DO I LOVE MOST?
00:22
dednahype
Рет қаралды 79 МЛН
Неприятная Встреча На Мосту - Полярная звезда #shorts
00:59
Полярная звезда - Kuzey Yıldızı
Рет қаралды 7 МЛН
Smart Sigma Kid #funny #sigma #comedy
00:25
CRAZY GREAPA
Рет қаралды 9 МЛН
ТОП 5 Ошибок в написании функций Python
12:46
how to create ProgressBar in customtkinter
4:05
Free Python Code
Рет қаралды 1,7 М.
__new__ или __init__ в Python? Знаете ли вы это..
12:37
The BETTER Raspberry Pi? // ZimaBlade Review
13:41
Christian Lempa
Рет қаралды 9 М.
WHO DO I LOVE MOST?
00:22
dednahype
Рет қаралды 79 МЛН