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

แชร์
ฝัง
  • เผยแพร่เมื่อ 4 ก.พ. 2025

ความคิดเห็น • 385

  • @mpenzin
    @mpenzin 2 ปีที่แล้ว +158

    Можно порекомендовать автору не напускать туману насчет "сложностей" оператора is, а начинать с главного - разницы между понятиями равенства (equals) и идентичности (identity), после этого вопросы и нюансы насчет того, когда какой использовать отпадает сам собой.

    • @Ivan_Balakirev
      @Ivan_Balakirev 2 ปีที่แล้ว +3

      и еще, что объекты бывают изменяемые и нет и какие

    • @azerkoron
      @azerkoron 2 ปีที่แล้ว +20

      Он одну и туже информацию повторяет раз по десять, добавляя немножко нового, это раздражает, ощущение что растянуть видео хочет

    • @imfiwile8995
      @imfiwile8995 2 ปีที่แล้ว +2

      @@azerkoron за видео короче 10 минут не платят деньги

    • @meetthespy3398
      @meetthespy3398 2 ปีที่แล้ว +3

      @@imfiwile8995 ни за какое видео не платят деньги, очнись

    • @shadowplay1211
      @shadowplay1211 ปีที่แล้ว +2

      Согласен, одна вода в видео

  • @EvgenijJobs
    @EvgenijJobs 2 ปีที่แล้ว +91

    А теперь небольшой нюанс.
    Если писать не в консоли, где подтягивается только сам интерпретатор, а запускать скрипт, то все числовые значения будут иметь одинаковые адреса. Это связано с оптимизацией по памяти. Грубо говоря, 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 2 ปีที่แล้ว +3

      "То все числовые значения будут иметь одинаковый адрес", нет не будут. Если вы не знаете python внутри то вот: по умолчанию, в питоне числа от -5 до 256(это можно настроить если вы сами компилируете свой питон) являются простыми числами(ну в исходниках они "small_int" и имеют 1 адрес.)

    • @tzn9597
      @tzn9597 7 หลายเดือนก่อน

      Он говорил что если написать a = 1111 и b = 1111 в файле, то выведет True, так как у них одна и та же ссылка на pyobject, а в консоле как раз значения от -5 до 256. ​@@dail4568

  • @user-of-world
    @user-of-world ปีที่แล้ว +8

    В 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" для сравнения таких переменных.
    Проблемы с изменяемыми объектами: Если вы изменяете изменяемый объект, на который указывают две переменные, это может привести к непредвиденным результатам, если вы не ожидаете, что эти переменные указывают на один и тот же объект в памяти. В таком случае следует использовать копирование объекта, чтобы создать новый объект, а не изменять существующий объект.

  • @АндрейМихайлов-о6я3ц
    @АндрейМихайлов-о6я3ц 2 ปีที่แล้ว +2

    6:30 - "как пишут на различных сайтах" - одна бабка сказала, а она-то врать не будет. блин. сам же пользуется id, вызвал бы id до добавления символа и после, и тогда бы внезапно обнаружилось, что строки в питоне неизменяемые, а любая операция со строкой, "модифицирующая" её - это просто создание новой строки. при этом старая никуда не девается и не изменяется, если на неё есть ссылки. объясняет то, чего сам не понимает.

  • @tinylith1603
    @tinylith1603 2 ปีที่แล้ว +5

    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

  • @whoareyou8480
    @whoareyou8480 2 ปีที่แล้ว +10

    Если переменная (допустим а) проверяется в 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 ปีที่แล้ว +2

      Это вообще мало кто использует , такая дичь вообще легко забывается ,а значит в питоне под запретом.

    • @fish9370
      @fish9370 2 ปีที่แล้ว +2

      Тем, кто пришел из других языков, волосы дыбом становятся от таких возможностей. Я в шоке

  • @bronis_lav
    @bronis_lav 2 ปีที่แล้ว +8

    Питон для оптимизации, значения размером с байт хранит в одном экземпляре. Есть локальные константы и если вы поменяете значение, то поменяется просто ссылка на другую константу. Небольшие значения используются часто и вполне логично, зачем в памяти размещать отдельную ячейку если такая уже есть. Поэтому все значения вписывающиеся в размер байта ссылаются на константы. Питон проверяет, если объявленная вами переменная имеет значение от 0 до 255, то производится проверка, если такое значение есть в локальных переменных, то оно просто ссылается на него, если нету, то создается новая константа. Но если значение больше 255 то под новую переменную выделяется память. По такому принципу работают виртуальные машины вроде JVM но вообще со всеми типами данных, не то чтобы я спец по питону или шибко догадливый xD Проблема тут не в операторе is, подобные есть во многих языках, а в "программистах" не знающих как оператор работает или не понимающих разницу между ссылкой на ячейку памяти и значением в памяти. Зачем городить такое видео, если просто очевидно есть операторы сравнивающие ссылки, а не данные.

    • @ЙенФенФыр
      @ЙенФенФыр 2 ปีที่แล้ว +1

      а вы случайно не знаете откуда берётся нижняя граница -5? Гугл не помог мне с поиском этой информации. Есть записи в духе "так оптимально!", но почему именно начинать с -5 - это оптимально не говорят

    • @TeslaDln
      @TeslaDln 2 ปีที่แล้ว

      @@ЙенФенФыр. Видимо для пользователя Nelsy это видео "просто очевидно", а Ваш вопрос нет.

  • @lolphdundgren4328
    @lolphdundgren4328 2 ปีที่แล้ว +2

    Странно. Что на двойке, что на тройке, в обоих случаях выдаётся 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
    >>>

    • @zproger
      @zproger  2 ปีที่แล้ว

      Действительно странно.
      А из под какой оболочки вы это запускаете? Не из под IDE случайно?

    • @lolphdundgren4328
      @lolphdundgren4328 2 ปีที่แล้ว

      @@zproger Mint Linux, из-под баша.

    • @flexyyyapk
      @flexyyyapk 2 หลายเดือนก่อน

      2.7....

  • @МаксимМячин-н6р
    @МаксимМячин-н6р 2 ปีที่แล้ว +12

    Для опытного может показаться фигней эта инфа, но для такого новичка, как я, эта инфа была довольно интересной и крайне полезной. Теперь, если буду сравнивать переменные с bool-значениями, то буду использовать оператор "is", а не двойное равно. Лайк для видео!

    • @ivkrak8258
      @ivkrak8258 ปีที่แล้ว +4

      Не сравнивай, а просто пользуйся тем, что оператор «if» работает только при истинном выражении.
      if a == True --> if a

  • @Тимофей-т5э
    @Тимофей-т5э 2 ปีที่แล้ว +6

    Вау, не знал об этом, спасибо за новую информацию!

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Рад что было полезно :)

    • @ДрейнРул
      @ДрейнРул 2 ปีที่แล้ว

      😶‍🌫️

    • @kequing792
      @kequing792 ปีที่แล้ว

      Тимофей, прошло 8 месяцев, как ты начал изучать Пайтон, чего добился ?

  • @5vFreeNz
    @5vFreeNz 2 ปีที่แล้ว +2

    Шикарный канал! Живи, человек! Спасибо!

    • @zproger
      @zproger  2 ปีที่แล้ว +2

      Рад был помочь :)

  • @Taron8117
    @Taron8117 ปีที่แล้ว

    Спасибо за подробности. Посмотрел несколько видео и только у Вас подробно о том, почему так

  • @wtfmaruni
    @wtfmaruni 2 ปีที่แล้ว +3

    Первый месяц как начал изучать Python, твой канал супер!

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Благодарю!

  • @ncertus
    @ncertus ปีที่แล้ว +2

    Это видео должно быть не об операторе "is" - с ним никаких проблем нет. Вся суть в переменных python, вернее в их отсутствии. Каждая "переменная" это "имя" ссылающееся на PyObject с типом данных, счетчиком ссылок и значением. Тут надо помнить, что большинсво типов - неизменяемы, т.е. меняя значение переменной с любым типом, кроме словаря, списка или множества, мы создаем новый PyObject. "is" возвращает "true" из-за peephole-оптимизации в Cpython, которая старается интернировать повторяющееся объекты.

  • @artembagachkov933
    @artembagachkov933 2 ปีที่แล้ว +36

    Вау, ты всегда объясняешь быстро, глубоко и понятно, а не так как множество блогеров, что только поверхностно затронут тему, и будут лить воду 10 минут

    • @zproger
      @zproger  2 ปีที่แล้ว +2

      Круто, спасибо :)

    • @zzzzzzzz6792
      @zzzzzzzz6792 2 ปีที่แล้ว +5

      @@zproger это сарказм, бро

    • @NahNahNahnana
      @NahNahNahnana 2 ปีที่แล้ว

      @@zzzzzzzz6792 учитывая что это подписчик думаю нет

  • @Dmitriitube
    @Dmitriitube ปีที่แล้ว +2

    Ну и почему кэшируются значения от -5 до 256?
    Почему были выбраны именно такие значение?

    • @mrdixioner
      @mrdixioner 9 หลายเดือนก่อน

      Тоже не услышал ответа.

    • @tzn9597
      @tzn9597 6 หลายเดือนก่อน

      Наверно самые часто используемые

  • @eg0or499
    @eg0or499 2 ปีที่แล้ว

    Ребят, поправьте меня я только начал изучать пайтон. В 6:09 ты говоришь, что сложно это понять. Строке hell присваивается новый айди из-за того, что строки являются неизменяемыми типами(это написано в любом учебнике по пайтон на первых страницах )данных и по сути когда к hell ты добавил o, пайтон затер строку hell и создал новую строку с соответственного новой ссылкой и на ячейку памяти. Это не флейм не упрек. Так классные видосы я смотрю тебя

  • @programming_etc
    @programming_etc 2 ปีที่แล้ว +1

    Годнота. Кстати какую систему юзаешь? Если не ошибаюсь, это же федора?

    • @zproger
      @zproger  2 ปีที่แล้ว

      Zorin OS

  • @anri_khv
    @anri_khv ปีที่แล้ว

    Очень полезная информация, простым языком на понятных примерах, подпишусь!!!

  • @WH1T3_69
    @WH1T3_69 2 ปีที่แล้ว +1

    Очень прикольное видео.
    Слава Богу, что наткнулся на твоё видео, а то пихал этот бедный is куда не попадя)))
    Правда потом использовал только оператор равенства
    Лайк!
    И подписка конечно же!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Благодарю, рад что помогло

  • @P0dCasts.io6o
    @P0dCasts.io6o 2 ปีที่แล้ว +1

    Не знал. Спасибо авторам!

  • @ValeriyLarin
    @ValeriyLarin 2 ปีที่แล้ว +2

    Спасибо за доступное разъяснение. Жду новых видео)

    • @zproger
      @zproger  2 ปีที่แล้ว

      Рад что понравилось

  • @__s__a__b__i__r__
    @__s__a__b__i__r__ 2 ปีที่แล้ว +1

    Просьба снимать похожие видосы, всё по порядку объяснил , спасибо

    • @zproger
      @zproger  2 ปีที่แล้ว

      Круто, буду стараться делать подобные видео =)

  • @СергейЛинник-с5к
    @СергейЛинник-с5к 2 ปีที่แล้ว +1

    Никогда не использовал is для сравнения строк и чисел, но спасибо за информацию. Очень любопытно.

  • @VideoWWB
    @VideoWWB 2 ปีที่แล้ว +1

    Спасибо большое ,вчера мудохался с парсером и думал в чём проблема ,а вот она оказывается.)

    • @zproger
      @zproger  2 ปีที่แล้ว

      Рад что помогло =)

  • @sashikshik
    @sashikshik 2 ปีที่แล้ว +1

    Спасибо, до видео вообще не слышал про этот оператор)

  • @ВладДунаев-д5ъ
    @ВладДунаев-д5ъ 2 ปีที่แล้ว +1

    Я этого не знал. Большое спасибо.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Рад что было полезно!

  • @holdin_lord
    @holdin_lord 2 ปีที่แล้ว +1

    Очень круто! Спасибо, я не знал!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Рад что понравилось :)

  • @anty1101
    @anty1101 2 ปีที่แล้ว

    Спасибо за видео, познавательно. А из комментов узнал ещё больше.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Это хорошо

  • @A5ter
    @A5ter 2 ปีที่แล้ว +30

    Не представляю каким образом за 5 лет кодерства я не столкнулся с потребностью копировать списки. Да, я не знал про эту примитивщину. О_о
    Спасибо!

    • @zproger
      @zproger  2 ปีที่แล้ว +5

      Бывает) Тут ещё очень много таких подвохов, знать о всех сразу нереально

    • @Fluery-9106
      @Fluery-9106 2 ปีที่แล้ว +1

      @@zproger в питоне это явно более реально, нежели в JS, где всяких неявных преобразований дохренилион с лишним)

    • @artyom_trustee
      @artyom_trustee 2 ปีที่แล้ว +5

      как можно кодить 5 лет и не знать как работает память?

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว +2

      @@Fluery-9106 это намного явнее, если использовать язык с явными указателями, там такой вопрос как-то не возникает, ибо и так все понятно

    • @taee1938
      @taee1938 2 ปีที่แล้ว +4

      @@artyom_trustee так он питонист)

  • @НурболатЗару
    @НурболатЗару 2 ปีที่แล้ว +1

    Отличный материал, успехов вам

    • @zproger
      @zproger  2 ปีที่แล้ว

      И вам успехов :)

  • @evgeny_01_12
    @evgeny_01_12 2 ปีที่แล้ว +1

    Спасибо, за полезную информацию!)

    • @zproger
      @zproger  2 ปีที่แล้ว

      Пожалуйста :)

  • @AA-zk1si
    @AA-zk1si 2 ปีที่แล้ว +1

    я не знал. интересненько!

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Рад что понравилось :)

  • @mcomponent
    @mcomponent 2 ปีที่แล้ว +2

    Драсьте, расскажите про Cython и Ctypes в планах оптимизации, если можно. Вкратце, Python хорошо контактирует с C и C++ и это часто используется в целях оптимизации.
    Cython - отдельная надстройка над питоном в виде модуля, которая позволяет компилировать дополненный синтаксис в C.
    А ctypes позволяет загружать и связывать DLL и Shared библиотеки в Python, это выглядит примерно так же, как динамическая подгрузка в C (если вы занимались этим когда нибудь).
    Ctypes быстрее, но поддерживать трудно. Cython медленнее, в некоторых ситуациях он даже даёт лишнее время выполнение по сравнению с обычным питоном, ведь вся оптимизация в основном построена на статической типизации, но поддержка проще и быстрее. Cython ещё можно распространять в виде пакета PyPI.

  • @flueriexeflueriexe7040
    @flueriexeflueriexe7040 2 ปีที่แล้ว +1

    Но спасибо Вам за Ваши старания!!!!! Ждём новых видео!!!!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Спасибо :)

  • @ГеннадийШушпанов-д1ч
    @ГеннадийШушпанов-д1ч 2 ปีที่แล้ว +3

    Коллеги, подобные "чудеса" случаются из-за небрежности в изучении семантики операторов. "Сравнение значений объектов"! и "Проверка идентичности объектов" -- разные операции и не взаимозаменяемые.

  • @master8920
    @master8920 2 ปีที่แล้ว +13

    Спс теперь понятно что is не для строк, чисел и тд., Да и вообщем я не знал почти все 😆 Спасибо за годный контент пока что такого подробного контента, я не встречал 🔥

    • @zproger
      @zproger  2 ปีที่แล้ว +4

      Рад что понравилось, буду стараться и дальше :)

  • @user-hammer1974
    @user-hammer1974 2 ปีที่แล้ว

    Столкнулся не знал. Понял что связано с количеством бит. Но не знал что это хранится по адресам и тем более не знал что от -5 до 256. Спасибо за ролик. Ох уж этот оператор is , то является , то не является. Вывод строки всяко будут не равны. Значения надо проверять через id.

  • @Igrok_x_xp
    @Igrok_x_xp 2 ปีที่แล้ว +1

    Это, как я слышал, из-за того, что при запуске программы питон инициализирует числа от 0 до 256(255) для ускорения работы.

    • @sxnity6808
      @sxnity6808 2 ปีที่แล้ว +3

      От -5 до 255 =)

    • @loafius
      @loafius 2 ปีที่แล้ว

      @@sxnity6808 почему именно от -5? Как я понимаю, это должно быть привязано к байту (0-255), но почему сверху насыпали ещё чисел?

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      @@loafius как говорят "питон изичный язык", а как начинаешь разбираться, так подводных камней намного больше, чем в плюсах

  • @7IdE
    @7IdE 2 ปีที่แล้ว +2

    "Так почему же именно от -5 до 256? Сейчас объясню". И не объяснил. Норм так.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Объяснил, потому что Python резервирует стандартные значения

    • @7IdE
      @7IdE 2 ปีที่แล้ว +2

      @@zproger , вопрос не в том, есть оно или нет. А в том, как ты сам и сформулировал: "почему не до 1000?".
      Или "почему не от -256 до 256"? Или "почему не с -6 до 256"?

    • @zproger
      @zproger  2 ปีที่แล้ว

      Ну так я ведь после этого и сказал что для зарезервированных значений хватает 256, нет смысла выделять больше

    • @7IdE
      @7IdE 2 ปีที่แล้ว +1

      ​@@zproger, и до сих пор нет ответа. Почему именно такие значения. Почему не -4? Нам где-то нужно именно -5? И почему 256? Где объяснение необходимости КОНКРЕТНЫХ граничных условий?

  • @agentsmit09
    @agentsmit09 2 ปีที่แล้ว +3

    На питоне не кодирую постоянно. Оказывается он очень коварный. Он оказывается не присваивает значения, а просто передает ссылку. Сишнику будет трудно к такому привыкнуть.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Ну да, Python же под капотом на Си работает

    • @agentsmit09
      @agentsmit09 2 ปีที่แล้ว +1

      @@zproger Я про то что и не в курсе был, что питон вместо передачи значения по факту передает ссылку. В Си все четко, передаешь значение - передается значение, передаешь ссылку - значит будет ссылка

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      И не нужно привыкать, питон временый, а Си вечный

  • @Drip_harden
    @Drip_harden 2 ปีที่แล้ว

    do more of this!! this is amazing

  • @ВолодимирБожко
    @ВолодимирБожко 2 ปีที่แล้ว +2

    Дякую! Цікаве та корисне відео!

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Благодарю :)

  • @mak32
    @mak32 2 ปีที่แล้ว +1

    Знал про ссылки и списки, но то что is работает имеено так, никогда не задумывался

    • @zproger
      @zproger  2 ปีที่แล้ว

      бывает :))

  • @ВиталийКоновалов-г1ц
    @ВиталийКоновалов-г1ц 2 ปีที่แล้ว +1

    спасибо! для меня это было ново!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Рад что видео принесло пользу :)

  • @loktarogar6017
    @loktarogar6017 2 ปีที่แล้ว +1

    Годний контент, лайк 👍

    • @zproger
      @zproger  2 ปีที่แล้ว

      Благодарю

  • @axathearcticfox5514
    @axathearcticfox5514 2 ปีที่แล้ว +2

    Спасибо!
    1.5 часа парился с хрена ли "i^m" не равно "i^m". Не понимал какого хрена это так работает.
    Теперь мне стало понятней.

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      круто =)

  • @ИванВалеев-б1й
    @ИванВалеев-б1й 2 ปีที่แล้ว +6

    b += 'o' ==> b = b + 'o' ==> сначала высчитывается правая сторона, получается новый объект и новая ссылка на него.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Интересно

  • @whale5219
    @whale5219 2 ปีที่แล้ว +1

    Строки это неизменяемый тип данных и в данном примере просто создается новый объект с тем же именем в другой ячейке памяти. Списки же наоборот являются изменяемыми от чего id и не меняется.

  • @Ruslan501
    @Ruslan501 2 ปีที่แล้ว +1

    Не знал, спасибо!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Пожалуйста =)

  • @techgregory5253
    @techgregory5253 2 ปีที่แล้ว +1

    У меня нестандартный вопрос, почему выбрал Zorin OS для программирования, а не, например, Mint?

    • @zproger
      @zproger  2 ปีที่แล้ว

      Потому что он визуально лучше, видео более комфортно будет смотреть когда красивый интерфейс :)

    • @techgregory5253
      @techgregory5253 2 ปีที่แล้ว

      @@zproger я так и подумал) Но спросил на всякий случай, вдруг разница не только в интерфейсе

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      @@techgregory5253 разницы никакой

  • @al_xy
    @al_xy 2 ปีที่แล้ว

    Странный вопрос, но может быть ты или другой опытный человек, мог бы помочь мне определиться в сложившемся положении, буду крайне благодарен)
    Мне 20 лет, на данный момент учусь на 2 курсе в вузе, на прогера. Изучаем почти всё, что касается: базы данных, фронтенд, немного был геймдев, машинное обучение, собственно сам кодинг на C#, на следующем курсе будет бэкенд и т.д.
    Изначально я хотел посвятить себя самообучению 3D графике и дизайну, т.к., но семья убедила пойти в вуз. И вот, уже к концу 1 курса я начал отставать от учебной программы, т.к. пропадал интерес и желание, плюс я долго болел ковидом, возможно из-за того, что в вузе вместо настоящего программирования, дают всякие курсовые работы и кучу ненужной воды (сейчас я достаточно сильно отстал от программы). Останавливает меня от отчисления мысль о возможности получения диплома ВО в сфере кодинга и геймдева (что возможно было бы полезно для карьеры в 3D).
    Быть 3д художником, честно говоря хочется больше, чем прогером, мне нужно решить, отчисляться и вливаться в 3D, или упорно всё свободное время тратить, чтобы догнать учебную программу, закончить вуз и получить этот диплом (даже не знаю, стоит ли это того). Место проживания также играет значительную роль, ведь программисту 100% будет легче найти работу в регионе, да и, наверное, в принципе, в России...
    P.S. Моделировать, фотошопить, создавать что-то, креативить, заниматься творчеством, я делаю это в первую очередь из интереса, а программирование, наверное (это не точно), финансово выгодно и крайне актуально, не требует мощного железа, можно работать хоть в деревне, хоть на луне, и на обычном ноутбуке, а для того же 3д нужна мощная станция, это проблема для мобильности, да и стоит она не мало.
    Как один из факторов, учёба не дешёвая, эти деньги семья могла бы потратить на более важные нужды, я не очень понимаю, стоит ли оно того
    Отчислятся также обидно т.к. это моё первое образование, и получается, если отчислюсь, стану ненужным самоучкой (так говорят родители), в то время, как все остальные знакомые получат дипломы и станут квалифицированными спецами
    И небольшой вопрос, не по теме: Стоит ли покупать ноут или лучше вложиться в улучшение пк (мой пк: 16 гб, 1660S, i5 6600)?

  • @GoldoEb
    @GoldoEb 2 ปีที่แล้ว +1

    Из вашего объяснения показалось, что is - это бесполезный синтаксический мусор. Проверять, что значение true/false можно просто в if-statement без всякого is.
    Как я понял, фишка is в том, чтобы сравнить ссылки на объекты без использования id(a) == id(b) и всё.

    • @АлексейШатиров-о8ж
      @АлексейШатиров-о8ж 2 ปีที่แล้ว +1

      Не мусор. Когда пишешь свои классы, поведение == можно переопределить, а is всегда будет проверять, что в двух переменных один и тот же объект

    • @GoldoEb
      @GoldoEb 2 ปีที่แล้ว +1

      @@АлексейШатиров-о8ж а при чём тут классы? Как я понимаю, это единственно верное применение is проверить, что переменные ссылаются на одни и те же данные.

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      is это, в общем то, как &a == &b(взятие адреса переменной) в сишке, только из-за динамической типизации свои приколы вылазят из-за этого

    • @sergey8513
      @sergey8513 4 หลายเดือนก่อน

      С помощью is делается 2 вещи: 1) проверка тот ли это обьект 2) проверка является ли обьект того типа что нужен

  • @enrewardronkhall8340
    @enrewardronkhall8340 ปีที่แล้ว

    не знаю какую версию интерпретатора вы используете, но на 3.9 у меня не получилось повторить ваши результаты.

  • @bagamax
    @bagamax 2 ปีที่แล้ว +2

    Ну да, сначала визионеры щебечут про то, что явное лучше неявного, а простое сложного, а потом у разных переменных одинаковые йд и присвоение списка создаёт ссылки с обратной силой. Збсь, чё.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Бывает))

  • @alekseystepanov3852
    @alekseystepanov3852 9 หลายเดือนก่อน

    Я ещё знал про такое слово, как "интернирование"...

  • @nameless6529
    @nameless6529 ปีที่แล้ว

    Спасибо, очень понятно.

  • @logitec1994
    @logitec1994 2 ปีที่แล้ว

    Вся информация полностью новая, спасибо)

  • @normpochan
    @normpochan ปีที่แล้ว

    В питоне же всё является объектами, в том числе и числа.
    Под первые (не помню сколько, но вроде в диапазоне 200-300) сразу выделяется память, независимо от того, используем мы их или нет. Таким образом, когда мы пишем a = 200, b = 200, мы просто создаём ссылку на объект числа 200. А когда создаём большую чиселку, мы каждый раз создаём новый объект?
    Правда хз, что мешает нам создать объект большого числа один раз, а потом просто ссылки создавать, но видимо какой-то сакральный смысл в этом есть)
    upd:
    Не знал, что не первые 2хх чисел, а в диапазоне от -5 до 256. Теперь буду, спасибо)

  • @ViktorTolmachev
    @ViktorTolmachev ปีที่แล้ว

    Спасибо, видео полезное!

  • @Cent72984
    @Cent72984 ปีที่แล้ว

    Скорее всего это происходит из за оператора переполнения, int имеет максимальное значение 32к c копейками, переход за пределы данного количества, видимо происходят дополнительные операции, поэтому и имеем отличающиеся id.

  • @Fluery-9106
    @Fluery-9106 2 ปีที่แล้ว

    Никогда не приходилось пользоваться оператором "is", пользовалась им разве что когда учила python и не знала, для чего он нужен на самом деле. Если мне нужно сравнить значение, то, очевидно, оператор равенства "==", а если же нужно проверить переменную на "наличие значения", если можно так выразиться, то просто "if variable_name: ..." или "if not variable_name: ..." если нужно убедиться, что переменная является None, False, [], {}, либо еще чем-то пустым. Извиняюсь, если что-то говорю неверно, с теорией у меня дела не особо, но на практике при работе с кодом проблем никаких)

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      is это для сравнения адресов переменных

  • @debian_rangerit4704
    @debian_rangerit4704 2 ปีที่แล้ว +1

    Я не могу понять у тебя панель задач из kde, а консоль из gnome, какое у тебя окружение?

    • @zproger
      @zproger  2 ปีที่แล้ว

      Это zorin os core, у них это из коробки

  • @MrYuriyP
    @MrYuriyP 2 ปีที่แล้ว +2

    True или False в выражениях сравнения вообще не нужны.
    Достаточно написать if a:
    Выражение if a is True: имеет смысл только когда мы не уверены в типе переменной a.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Это да, но думаю не зря показал, так как уже лучше это, чем если будут писать if a == True

  • @lowfolen9827
    @lowfolen9827 2 ปีที่แล้ว +1

    Найс кликбэйт превьюшка, но ролик так или иначе +- полезный.

    • @zproger
      @zproger  2 ปีที่แล้ว

      Благодарю ;D

  • @lilproskater_
    @lilproskater_ 2 ปีที่แล้ว

    Если не ошибаюсь, Питон для оптимизации заранее создает в памяти числа от 0 до 255 так как они используются чаще всего и чтобы постоянно не выдялять память это сделано как оптимизация. Из-за того что int - immutable можно и не беспокоиться о том что зачение может поменять другая переменна.
    Ответил до твоего ответа, предположение :)
    UPD: Посмотрел ответ автора, немного ошибся с range'ом заранее выдляемых чисел 😁 Спасибо за напоминание

    • @TeslaDln
      @TeslaDln 2 ปีที่แล้ว

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

  • @РомановАндрей-х2д
    @РомановАндрей-х2д 2 ปีที่แล้ว +1

    Хотел купить курс на степике, но не смог, так как он - в долларах, не проходит операция :(

    • @zproger
      @zproger  2 ปีที่แล้ว

      Ага, из-за санкций временно нельзя купить, но можете отписать мне на почту (zproger777@gmail.com), что-то придумаем

  • @АлексейБочаров-т1и
    @АлексейБочаров-т1и 2 ปีที่แล้ว

    Спасибо за разъяснение. Всё хорошо, но музыка лишняя.

  • @flueriexeflueriexe7040
    @flueriexeflueriexe7040 2 ปีที่แล้ว +1

    Здравствуйте, спасибо за видео! Мне понравилось! Я, правда, ничего не понял, но очень интересно

    • @zproger
      @zproger  2 ปีที่แล้ว

      хаха)

  • @demg7738
    @demg7738 ปีที่แล้ว

    "IS" - это проверка ID объектов на равенство, то есть:
    id(obj_1) == id(obj_2)
    В 99% случаев (НИКОГДА) не следует заменять проверку равенства объектов этой операцией, т.к. это очень сильно зависит от реализации интерпретатора и системы!

  • @mlr__roal_6867
    @mlr__roal_6867 2 ปีที่แล้ว +1

    Во блин. Спасибо большое. Но откуда ты это все знаешь?

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Читаю много контента по Python и собираю его в копилку :)

  • @scanvinlav
    @scanvinlav 2 ปีที่แล้ว +1

    Вы следующей ячейке, вы переменной, вы итоге..... Почему ты вЫкаешь, а не говоришь В переменной, В ячейке?

    • @zproger
      @zproger  2 ปีที่แล้ว

      не знаю =)

  • @АлексейЛавренович-х7е
    @АлексейЛавренович-х7е 2 ปีที่แล้ว +1

    Я вижу тут много кто говорит насчёт использования маленьких чисел и оптимизации кода относительно этого, типа поэтому диапазон от -5 до 256. У меня есть другое предположение: что насчёт байткода? Если посмотреть на дизассемблированный скрипт через dis, можно заметить, что местные команды как раз имеют порядковые номера, умещающиеся в байт. Это как-то связано с этим или я ошибаюсь?

  • @psibladdeSSS
    @psibladdeSSS 2 ปีที่แล้ว +1

    Интересное видео) спасибо

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Круто, рад что понравилось!

  • @Тактиль
    @Тактиль 2 ปีที่แล้ว

    4:44 - Что-то я такое и думал, что в непонятно чём хранится размер числа или слова(в данном случае в ячейке находится число или слово), и если написать больше, чем ячейка может вместить в себя, то остаток она разбивает на другую ячейку, и получаются разные значения

  • @mikema______1170
    @mikema______1170 2 ปีที่แล้ว

    Не "в памяти выделяется строка", а "память выделяется под хранение строки"

  • @timofeybelyakov7752
    @timofeybelyakov7752 ปีที่แล้ว

    Для pycharm не актуально: id всегда одинаковые для равных значений. Однако для дефолтной питоновской idle всё, как на видео.

  • @2Quard
    @2Quard 2 ปีที่แล้ว

    При просмотре вспомнил указатели и ссылки в си-пи-пи

  • @dmitryowdienko3920
    @dmitryowdienko3920 2 ปีที่แล้ว

    За значения выше 255 не знал. Но тема не новая, так как вместо указателей у нас по сути референсы - то же, что и в плюсах, только более неявно, там хоть амперсанд при объявлении написать нужно, а тут "специфика языка". Нужно было скорее всего для экономии на копировании. Кстати, в 2.х и 3.х одинаково работает? Проверять лень.

  • @re555-j7i
    @re555-j7i 2 ปีที่แล้ว +1

    Я думал СиШарп самый запутанный с кучей условностей. Не-а...

    • @zproger
      @zproger  2 ปีที่แล้ว

      Шарп вроде простой достаточно

    • @re555-j7i
      @re555-j7i 2 ปีที่แล้ว

      @@zproger как и везде итерировать массив - легко, а потом пытаешься понять разницу между struct, immutable struct, record и всеми видами class'ов, например. Или что именно получается в IL. 🤯

    • @Dmytro-Tsymbaliuk
      @Dmytro-Tsymbaliuk 2 ปีที่แล้ว

      @@re555-j7i плюсы будут проще, я вполне серьезно

  • @AntonNovikov-d2u
    @AntonNovikov-d2u 2 ปีที่แล้ว +1

    Привет, напомни, что за оболочка для python в терминале?

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      bpython

  • @andreymishuk2188
    @andreymishuk2188 2 ปีที่แล้ว +2

    Очень годный контент, почему так мало лайков собираем?!? А ну-ка.... Ыть...)

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      :)))

  • @bloodlust1203
    @bloodlust1203 ปีที่แล้ว

    9:44 VC Code вообще не дал мне проверить это равенством, выдавала ошибку и подсказала как надо.

  • @mikhailyagodin841
    @mikhailyagodin841 ปีที่แล้ว

    При изучении любого языка программирования следует читать стандарт языка про операторы присваивания, сравнения, is и прочее.
    Ну и язык... В 2023 году я не хочу этим заморачиваться и поэтому не программирую на Пайтоне.

  • @КонстантинСухопаров-с7ъ
    @КонстантинСухопаров-с7ъ ปีที่แล้ว

    Потому что пул чисел. Ставьте лайки, подписывайтесь на канал

  • @ode2877
    @ode2877 2 ปีที่แล้ว +1

    Пример с превью лажа, 455 is 455 true, я уж думал какой хак, разочарования, а про сравнение ссылок и значений и так все знают

    • @zproger
      @zproger  2 ปีที่แล้ว

      Это смотря где сравнивать, если вы запустите в IDE - будет true, а в интерпретаторе будет false :D

    • @ode2877
      @ode2877 2 ปีที่แล้ว

      @@zproger приложил бы скрин до тут нельзя, проверял в интерпретаторе

    • @ode2877
      @ode2877 2 ปีที่แล้ว

      @@zproger раз в год и электрон в транзистор лишний залетает

  • @Ameta1996
    @Ameta1996 2 ปีที่แล้ว +1

    В "стандартном Python" - всё нормально с id и ограничений на -5 и т.д. нет

  • @izumrita5694
    @izumrita5694 5 หลายเดือนก่อน

    Спасибо за видео!

  • @hitakeri
    @hitakeri 2 ปีที่แล้ว +1

    Странно, я вообще только начал учиться и был безумно удивлён, от информации в данном видео. Решил я это проверить и оказалось, что всё работает нормально:
    a = 3000000
    b = 3000000
    print (id(a))
    print (id(b))
    if a is b:
    print ("True")
    введя это в Pycharm выдало вот такой результат:
    2366882699472
    2366882699472
    True
    Process finished with exit code 0
    может я чего то не понимаю? или может это уже пофиксили, может сам Pycharm сам как это исправляет. Кто ни будь может объяснить в чём дело?

  • @palyaros02
    @palyaros02 2 ปีที่แล้ว +1

    А что за интерпретатор такой прокачанный с подскасками?

    • @zproger
      @zproger  2 ปีที่แล้ว

      bpython

  • @BlindKick
    @BlindKick 2 ปีที่แล้ว

    Интересный такой вопрос, почему в REPL, is работает иначе, даже введя числа больше 256, он будет показывать True?

  • @FXUNDPLXGG
    @FXUNDPLXGG 2 ปีที่แล้ว +2

    О, а как ты сделал подсказки в интерпретаторе питона?
    P.S: спасибо что пояснил за is

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      Я ничего не делал, оно по умолчанию так :)
      Это bpython

    • @X3osha
      @X3osha 2 ปีที่แล้ว +1

      В sublime text это плагин anaconda

  • @Shadowfight-z5f
    @Shadowfight-z5f 2 ปีที่แล้ว

    Мне бы в башку никогда не пришло сравнивать не изменяемые типы данных(строки, числа через is) Списки - понятно но вот числа зачем?
    9:29 А здесь я бы написал
    if a:
    или
    if not a
    а не
    if a is True
    или
    if a == True

  • @sezamenko
    @sezamenko ปีที่แล้ว

    Да это особенность питона, до определённого числа по-моему до 255 одинаковые значение имеют один и тот же адрес для оптимизации самого скрипта чтобы не создавать копию создаёться ссылка на значение

  • @alexanderoverchenko5770
    @alexanderoverchenko5770 2 ปีที่แล้ว

    А зачем в if использовать конструкцию типа "if a==True:", если можно просто написать "if a:"
    ?

  • @flueriexeflueriexe7040
    @flueriexeflueriexe7040 2 ปีที่แล้ว +1

    А ещё у меня есть определенные вопросы к Вашему дистрибутиву....., а точнее, к его интерфейсу

    • @zproger
      @zproger  2 ปีที่แล้ว

      Нормальный интерфейс вроде как)

  • @VoidObj
    @VoidObj 2 ปีที่แล้ว +1

    пайтон не знаю, предполагаю что в первом случае переменной присваевается char а во втором int. А оператор is сравнивает ссылки, как и в джава.

    • @VoidObj
      @VoidObj 2 ปีที่แล้ว

      ну.. на 50% угадал :D

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      на 50% да)

  • @invinciblecame7336
    @invinciblecame7336 ปีที่แล้ว

    Всегда удивляло как некоторые выдумывают себе проблемы и героически с ними борются. Не используй то, в чем не разобрался, особенно когда есть более простой и эффективный аналог.

  • @CheatCraft
    @CheatCraft 2 ปีที่แล้ว +1

    Что за шелл используется?

    • @CheatCraft
      @CheatCraft 2 ปีที่แล้ว

      Для автокомплита

    • @zproger
      @zproger  2 ปีที่แล้ว +1

      bpython

    • @CheatCraft
      @CheatCraft 2 ปีที่แล้ว

      @@zproger спасиб

  • @ИраФомченко
    @ИраФомченко 2 ปีที่แล้ว +1

    Я всем говорю, что питон сложнее ассемблера!

    • @zproger
      @zproger  2 ปีที่แล้ว

      Учу сейчас ассемблер и это ад))