В Python - нет переменных. И как теперь жить? Python Memory Management на пальцах

Поделиться
HTML-код
  • Опубликовано: 8 июн 2024
  • Да-да, в Python нет переменных. Как так вышло и что с этим делать? Как работает с оперативной памятью Python? Что такое Stack и Heap и как они используются? Какие особенности mutable и immutable данных связаны с этим?
    Сочный материал для тех, кто хочет глубже понимать, как работает интерпретатор CPython, и использовать это для написания более эффективных программ.
    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
    Telegram: t0digital.t.me
    0:00 О чём пойдёт речь
    0:43 Об оперативной памяти
    3:12 Stack и Heap в оперативной памяти
    7:19 Как использует память Python?
    10:50 Неизменяемые строки
    11:49 Про списки и оператор is
    14:11 Про кортежи
    16:15 Garbage Collector и подсчёт ссылок
    20:41 Передача объектов в функции по ссылке
    24:18 Выводы
    /****************** about ******************/
    Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
    - Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
    - Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
    Telegram канал - t.me/t0digital
    ВК - digitalize.team
    RuTube - rutube.ru/channel/24802975/ab...
    Дзен - dzen.ru/id/6235d32cb64df01e6e...

Комментарии • 431

  • @t0digital
    @t0digital  5 месяцев назад +1

    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Вжух!

  • @binaryman440
    @binaryman440 2 года назад +188

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

    • @t0digital
      @t0digital  2 года назад +6

      Спасибооо!

    • @eagold
      @eagold 2 года назад +2

      а я не знал, и было очень интересно

    • @user-sz1us3en9i
      @user-sz1us3en9i 2 года назад +3

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

    • @the2soul
      @the2soul Год назад +1

      вот зачем нужно учить Си) хотя, я эти нюансы узнал, изучая Pascal, но не суть, полезно учить более низкоуровневые языки

    • @Hardy_21
      @Hardy_21 6 месяцев назад

      Соглашусь с @binaryman440, хоть и сам владею питоном, но посмотрел почти все видео этого канала.
      @t0digital вы тот специалист которого бы хотелось иметь в своей команде. И один и из трех русскоговрящих айти блогеров которых я вообще смотрю.

  • @mkhnuser
    @mkhnuser 2 года назад +21

    Алексей, ещё не посмотрел видео, но уже знаю, что будет годнота. Большое спасибо за рассматривание intermediate топиков, таких видео мало. Успехов с каналом!

    • @sergeys4732
      @sergeys4732 2 года назад

      Так у лутца все написано слово в слово) это база, а не интермидиейт уровень, база которую надо знать как отче наш

  • @nazimtairov6861
    @nazimtairov6861 2 года назад +32

    Спасибо за выпуск. Следующая идея для ролика: Рассказать/показать как работать с утечками в памяти. Думаю, большинству будет полезно как хантиться за memory leaking'ом.

  • @andreiosipov2766
    @andreiosipov2766 2 года назад +24

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

    • @user-iq2st2el2d
      @user-iq2st2el2d 2 года назад

      так суть именно в обычном копировании, а так можно пройтись рекурсией, чтобы все вложенности скопировать. copy отвечает именно за поверхностую целостность структур, чтобы каждая позиция ссылалась на одну область памяти и выдавать ошибку в случае изменения этой позиции, а какие структуры внутри уже, на это copy чихать. Иными словами, copy не следит за тем, какие структуры внутри основной.
      Пример с кортежем это подтверждает, область памяти не меняется, вот ему и чихать, какая там структура

    • @andreiosipov2766
      @andreiosipov2766 2 года назад

      @@user-iq2st2el2d если бы ваш ответ было возможно прочитать - было бы намного лучше)

  • @hopelesssuprem1867
    @hopelesssuprem1867 2 года назад +3

    Очень классный видос, было бы круто, если бы ты сделал такие же видосы про асинхронность и многопоточность: что и когда лучше использовать, какие проблемы они решают, какие у них есть методы и как их лучше использовать и т.д.

  • @maxtaranenko9620
    @maxtaranenko9620 2 года назад +18

    Супер, только в примере про getrefcount посчитались не a и b, в них лежит нан так как там был вызов функции.
    import sys
    def empty(): pass
    print(sys.getrefcount(empty))
    тоже напечатает 2 :)

    • @t0digital
      @t0digital  2 года назад +11

      да, там надо было не вызывать эту функцию, конечно.
      import sys
      def empty(): pass
      a = empty
      b = empty
      c = empty
      d = empty
      print(sys.getrefcount(empty)) # 6

  • @user-zo5ow5pb5v
    @user-zo5ow5pb5v 2 года назад +72

    Алексей, спасибо за выпуск!
    Рассмотрите, пожалуйста, тему "Утечки памяти в Python", мало кто задумывается об этом, в нашем любимом языке (

  • @alisherrakhimov1997
    @alisherrakhimov1997 2 года назад +1

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

  • @MrRussianuser
    @MrRussianuser 2 года назад +25

    Переменная (программирование) - поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным и изменять значение в ходе выполнения программы.
    Если давать такое определение, то объект в куче можно назвать переменной, а в коде мы ссылаемся на эту переменную через ссылки (масло масленное). Ролику конечно лайк в любом случае

    • @AlexDanov
      @AlexDanov 2 года назад

      Добавлю от себя:
      Переменная - именованная область памяти! Указатель это тип переменной, адрес другого места в памяти с данными. Обычно доступен в двух режимах: можно прочесть адрес, а можно значение по этому адресу (обычно в куче). А ссылка это указатель, т.е. переменная типа указатель, которая в обычном режиме получает значение по хранимому адресу, без доступа к указателю, без арифметики указателей, т.е. только один режим доступа, обычно неотличимый от переменной простого типа (целого). Т.е. ссылка это тоже тип переменной. Поэтому "В Python нет переменных, а есть ссылки" это троллинг, свой сленг, может быть допустимый в пределах небольшой песочницы.

    • @t0digital
      @t0digital  2 года назад +4

      @@AlexDanov есть устоявшаяся терминология в языках программирования. Python же не один язык на планете. Вот вы говорите об указателях и ссылках. В питоне же нет явного разделения - вот переменная, вот указатель, вот ссылка. В C++, скажем, есть - и это все 3 разные понятия. Что из этого является «переменной» в Python?

    • @t0digital
      @t0digital  2 года назад +3

      @@kirillgimranov4943 автор не шарит, поясните тупенькому:)

    • @AlexDanov
      @AlexDanov 2 года назад +4

      @@t0digital переменная связывает имя со значением, которое можно менять, а не с коробкой! Значением может быть адрес объекта в памяти. Всё как обычно. В конце концов, Python поверх Си работает, из которого берется терминология. Попытка утверждать, что в пайтоне нет переменных это антипаттерн, как кнопки работы с окном слева в MacOS, в противовес кнопкам справа в Windows. Или переставленные кнопки Ok/Cansel. Чтобы "а нефиг!" между платформами прыгать. Аналогично вдруг в Python пропали переменные. Хотелось бы узнать первоисточник этой "мудрости".

    • @t0digital
      @t0digital  2 года назад +1

      @@AlexDanov и всё ж таки вы не ответили на мой вопрос

  • @OmgOrganic
    @OmgOrganic 2 года назад +2

    Открыл для себя хранение данных с абсолютно новой стороны. Раньше вообще не задумывался как и где все это дело хранится. Спасибо!

  • @andro_id
    @andro_id Год назад

    Спасибо за отличную подачу крайне важной темы. Давно были попытки найти хорошее объяснение работы пайтона с памятью, но только здесь удалось получить наиболее исчерпывающее :)

  • @user-ig4jo7mg5f
    @user-ig4jo7mg5f 2 года назад +1

    Круто, очень интересно!

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n 2 года назад +3

    Спасибо! Гениальное видео! Пожалуйста, сделай видео про unix утилиты sed и awk

  • @swimmwatch
    @swimmwatch 2 года назад

    Спасибо за Ваш контент!

  • @nopiece3733
    @nopiece3733 2 года назад +12

    Все круто, отличная подача для начинающих. Спасибо за проделанную работу)
    Но есть один момент:
    Там где идёт работа с функцией empty закралась опечатка/ошибка. В переменные a, b присваивается не объект функции, а непосредственно результат её выполнения. Скобки были лишними.

  • @SergeyTarabara
    @SergeyTarabara 2 года назад

    Классное видео! Спасибо! А можно такое же про asyncio, конкаренси и мультисрединг подходы в питоне.

  • @chum2470
    @chum2470 2 года назад +3

    Побольше такого контента пожалуйста!

    • @t0digital
      @t0digital  2 года назад +2

      Буду делать, спасибооо!

  • @exe88cution
    @exe88cution 2 года назад +2

    Качественно записано/сделано, хорошо поставленная речь - приятно слушать. Надеюсь и дальше продолжите рассматривать углублённые темы, очень интересно

    • @t0digital
      @t0digital  2 года назад

      Спасибоо🙏

  • @vladimirsemenov942
    @vladimirsemenov942 2 года назад +3

    Очень годное объяснение, большое спасибо! Хотелось бы видосики в таком же стиле по алгоритмам и по static и class methods.

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw Год назад

    Огромнейшая благодарность!

  • @domochevsky4703
    @domochevsky4703 2 года назад +1

    Хороший видос. Спасибо.

  • @stas_v
    @stas_v 2 года назад

    Спасибо! Очень познавательно.

  • @swag4297
    @swag4297 2 года назад

    Огромное спасибо, очень интересное видео: ты знаешь из этого что-то, но как-то никогда не экспериментировал и смотришь как будто на сакральные знания, воу.

  • @georgiy_kulagin
    @georgiy_kulagin 2 года назад

    Очень годное видео! Все эти "подкапотные штуки" - очень интересная тема и её очень мало в русскоязычном сегменте youtube или блогосфере. Спасибо!

  • @IndianaJons1986
    @IndianaJons1986 2 года назад

    Спасибо, подробно, интересно и полезно.

  • @hatiko8227
    @hatiko8227 2 года назад +4

    А теперь вспоминаем что ссылка - это частный случай переменной)

  • @user-cj3bs1fi8i
    @user-cj3bs1fi8i 8 месяцев назад

    Хосподя! Спасибо Алексею! Я только изучаю вот это вот все))) Но, в таком доступном формате изложения я еще не встречала! Прям обняла))

    • @t0digital
      @t0digital  8 месяцев назад

      Спасибо! Рад, что полезно!

  • @egoruzh
    @egoruzh 2 года назад

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

  • @piktogor
    @piktogor Год назад

    Большое спасибо! Высший пилотаж рассказчика)

  • @artemkaliuzhnyi8276
    @artemkaliuzhnyi8276 2 года назад

    Спасибо большое, очень помогло ваше видео

  • @XXzoroXy
    @XXzoroXy 2 года назад +3

    Лайк тебе, доходчиво объясняешь. Спасибо за труд и удачи!

  • @probro-cw9rt
    @probro-cw9rt Год назад

    Большое спасибо за интересную подачу, важного новичкам материала

  • @sfrnv_n
    @sfrnv_n 2 года назад +1

    Очень интересно и полезно, здорово что вы залезаете в самую глубь капота и объясняете работу его внутренностей на таких понятных примерах

  • @kostyanwest
    @kostyanwest Год назад +3

    Можно было бы ещё дать комментарий, по поводу того, почему у None и малых значений чисел (0, 1, 2) было так много ссылок: они хранятся в куче в единственном экземпляре для оптимизации. Именно поэтому объект можно сравнивать по адресу с None, а не только через оператор сравнения.

  • @VladimirSalygin
    @VladimirSalygin 2 года назад

    Интересно. Спасибо.

  • @rzabolotin
    @rzabolotin 2 года назад

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

  • @MS-fu3zf
    @MS-fu3zf 2 года назад

    Последний пример слегка удивил. Не знал, что функция может так работать. Спасибо.

  • @igormarkin7720
    @igormarkin7720 2 года назад +3

    То, что нужно. Пробелы в понимании заполнены, всё встало на свои места. Спасибо! Познавательно, интересно, понятно.

  • @user-ir4vd5yk4x
    @user-ir4vd5yk4x 2 года назад

    Спасибо очень доступно объяснили

  • @TheMonth1996
    @TheMonth1996 2 года назад

    Насчет последнего (20:41) всегда принимал за истину, т.к. это описано в PEP, а теперь предельно ясен данный момент. Алексей, спасибо

  • @AndreyZhivotovskiy1
    @AndreyZhivotovskiy1 2 года назад

    здорово. спасибо

  • @Nick-zu9bi
    @Nick-zu9bi 2 года назад

    Алексей, спасибо за видос

    • @t0digital
      @t0digital  2 года назад +1

      Спасибооо!

  • @OldHeffalump
    @OldHeffalump 2 года назад

    Очень круто!

  • @user-jk3cn7ck2f
    @user-jk3cn7ck2f 2 года назад

    Видос отличный, качество, как и всегда, на высоте. Тема полезнейшая. Да и вообще, многие твои видосы полезно пересматривать время от времени для закрепления. :)

  • @romanbush5164
    @romanbush5164 Год назад +1

    Начало объясняет азы плюсов)), стек , куча

  • @donfedor007
    @donfedor007 Год назад

    Доброе время суток! Список получается ранит коллекцию ссылок на объекты в куче? При этом сам список тоже хранится в куче? А ссылка на сам список хранится в стеке? Так?

  • @crazy_s9925
    @crazy_s9925 2 года назад +4

    Знал об этом, но материал подан качественно, начинающим обязательно к просмотру)

  • @billvoidcipher4591
    @billvoidcipher4591 9 месяцев назад

    Спасибо за прекрасное объяснение! Но у меня остался один вопрос. Как это в общем это обозвать, что проверяя ссылки на число или None, там было больше ссылок чем в коде(Что бы я мог нагуглить подобные случаи)? Я так понимаю так ссылаются на не изменяемые типы данных, чтобы экономить память.

  • @IgnatikVodichka
    @IgnatikVodichka 2 года назад

    Круто!))

  • @rlxinc.6016
    @rlxinc.6016 2 года назад

    Алексей, большое спасибо вам за ваши видео!
    Если не сложно, то назовите ваши топ-3 (а может и топ-5) тем в vim, просто интересно)

    • @t0digital
      @t0digital  2 года назад +2

      Они у меня плавающие - когда надоедает, ставлю новую:) Сейчас gruvbox стоит, гитхаб morhetz/gruvbox

    • @OlejkaLive
      @OlejkaLive 2 года назад

      Catppuccin, моднее просто нет

    • @rlxinc.6016
      @rlxinc.6016 2 года назад

      @@t0digital спасибо)

  • @user-bd9bf5kw3l
    @user-bd9bf5kw3l Год назад +1

    20:43 тут пожалуй новичок может запутаться, первое, что хочется добавить это то что если нужно обезопаситься от изменений объекта в функции методом копирования лучше всего использовать глубокое копирование (from copy import deepcopy), т.к. если у нас список списков при копировании срезом или стандартным методом copy происходит поверхностное копирование ссылок😊
    Ещё по поводу аргументов по умолчанию если это сложные объекты лучшей практикой будет указать None, а в самой функции уже присвоить необходимое деыолтное значение.
    А ну и тут стоит сказать что при передачи в функцию неизменяемых объектов таких накпример как числа связи уже не будет. (При увеличении полученнного числа в функции из вне значение не изменится)
    Надеюсь хоть кому-то будет полезно)
    А ещё можно поиграться и посмотреть что при создании нескольких имён на одинаковые неизменчемые объекты (например это особенно интересно со строками) все они будут ссылаться по одному адресу))

  • @mansimnovruzov7273
    @mansimnovruzov7273 2 года назад +1

    Спасибо в любом случае за старания) но хотелось бы более глубоких и неочевидных вещей.

    • @t0digital
      @t0digital  2 года назад +2

      Это видео возникло как ответ на один вопрос на курсе. Судя по комментам не для всех тут материал очевиден:)

  • @dazdess
    @dazdess 2 года назад

    Просмотрел видео до конца после просмотра лекций Хирьянова, он как раз объяснял материал основываясь на коробках, куда добавлял значения :)

  • @andreykorotkiy3397
    @andreykorotkiy3397 2 года назад

    Алексей, спасибо за выпуск! Как всегда все четко и понятно. Единственно пожелание касается вима - мог бы ли ты выводить на экран, что ты вводишь с клавиатуры. Мне как новичку трудновато понять, как все так быстро происходит)

    • @t0digital
      @t0digital  2 года назад

      это не будет отвлекать:)?

    • @andreykorotkiy3397
      @andreykorotkiy3397 2 года назад

      @@t0digital не знаю) Погуглил и нашел как я это себе представлял - ruclips.net/video/bSMZgXzC9AA/видео.html

  • @dmitryn.4506
    @dmitryn.4506 2 года назад +1

    Спасибо! Очень полезно для понимания того, как работает интерпретатор и язык! 👍

  • @mrkhloud
    @mrkhloud 2 года назад

    Узнал новое, спасибо

  • @Terrensino
    @Terrensino Год назад

    Спасибо за видео :)
    Недавно сам начал изучать Пайтон, делая в процессе игрушку, -- и сегодня долго не мог понять, почему один из алгоритмов не работал, как следует, хотя строки выглядели, как надо. Оказалось, что, когда присваивал одной из "переменных" значение другой, вместо этого происходило что-то иное -- и если значение менялось, то делало это сразу для всех "переменных" :D Когда осознал, что всё, что раньше у себя в коде считал переменными, на самом деле таковыми не являются, а присваивание работает не как присваивание -- испытал лёгкий шок и открыл для себя модуль copy, чтобы копировать значения и больше не бояться.
    Фух! Благодаря ролику убедился, что всё правильно понял :)

  • @plscomeback
    @plscomeback 2 года назад +3

    скажу кратко: просто и доступно!

  • @LukyTexan
    @LukyTexan 2 года назад +1

    Алексей, ты что-то вес набрал. Держи себя в форме, не расплывайся )) За ролики спасибо ))

  • @rockkley9159
    @rockkley9159 2 года назад

    Классно. Такое на курсах я не встречал, спасибо большое)

  • @hronoz40
    @hronoz40 2 года назад

    Шедевр

  • @knarg4682
    @knarg4682 Месяц назад

    22:40 -- вот как раз пример того, что пространство памяти у функции одно-единственное, сколько бы раз её ни вызывали. И поскольку список в нём не задаётся каждый раз заново, а хранится один и тот же (аж до окончания работы кода в области памяти, объемлющей данную либо пока не удалить принудительно), то эффект логичен и очевиден.
    "Пространства имён", говорили они, "это круто", говорили они. Так почему бы про них не помнить))

  • @user-xx6wh5nm4s
    @user-xx6wh5nm4s 2 года назад

    Лайк просто с разбегу!))

  • @uszr1
    @uszr1 2 года назад +5

    чаще, пожалуйста, делайте видео такого типа

  • @user-vd8qz1rk6m
    @user-vd8qz1rk6m 2 года назад

    Я теперь в теме, меня теперь не обмануть !)

  • @trezzh4
    @trezzh4 2 года назад

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

  • @aleks007rus
    @aleks007rus 2 года назад

    Благодарю

  • @user-jn4cq9dy3f
    @user-jn4cq9dy3f 2 года назад

    Для новичков чётко и доходчиво! ) В своё время об значение по умолчанию знатно спотыкался, да. ;-))) Ну и, конечно, по gc и weakrefs тоже полезно будет, ели будет. ;-)

  • @andreiosipov2766
    @andreiosipov2766 2 года назад +1

    Хоба! Вот это подгон, спасибо! И я снова котан

  • @acesultonov583
    @acesultonov583 2 года назад +24

    Если бы в универе так объяснили материал, то на 2 -ом курсе уже все (или почти все) могли бы стать крутыми программистами. Благодарим за материал. Ждем еще других выпусков.

    • @dmitriyobidin6049
      @dmitriyobidin6049 2 года назад +8

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

    • @Gabriel-hg7fl
      @Gabriel-hg7fl 2 года назад +4

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

    • @radlimon2466
      @radlimon2466 2 года назад +3

      @@dmitriyobidin6049 да нету у меня столько времени чтобы перемалывать все что есть в интернете и на ютубе. как раз подача в таком виде - большая редкость.

    • @acesultonov583
      @acesultonov583 2 года назад

      @@Gabriel-hg7fl Я имел в виду именно подход и метод подачи материалов по наглядности и доступности.

    • @acesultonov583
      @acesultonov583 2 года назад

      ​@@dmitriyobidin6049 Приветствую! )
      1 - На ютубе редко можно найти материалов которые так понятны и детально разобраны. А если можно найти, то они точно не структурированы и не собраны для конкретной специальностей или направлений как это сделано в универе. Тем более в комментах, я сравнил исключительно подачи и наглядность инфы.
      2 - Если даже на ютубе лежит нужный материал (что очень сомневаюсь), то не все кто смотрит ютуб хочет стать программистом. А учащихся в универе, почти все хотят, ибо они как-то готовятся, поступают и вложат свои лучшие годы на учебу. Универ точно имеет свои плюсы в плане развитие чела в приобретение софт скилы, связи и т.д..
      3 - Конечно -же, чтобы становиться "кем-то" , многое завесить от самого человека. Но, для того, чтобы найти достойных материалов, надо оочень стараться и искать зеттабайты инфы из инета.

  • @user-sc2zb1zp1m
    @user-sc2zb1zp1m 2 года назад

    Да, интересно было бы послушать подробнее про сам интерпретатор, и как на низком уровне он работает. Но довольно непривычно слышать о том, что глобальные переменные (переменные уровня модуля), а точнее их ссылки хранятся в стеке. Обычно я привык с стеку процедурному, потому как в этом есть смысл. Реализация объектной ориетированности Питона несколько непривычна, но знать, с чего начинает свою работу интерпретатор, и чем он ее завершает, было бы полезно. Как реализуются кучи в Питоне, или они пользуют стандартные кучи оси. На низком уровне у нас есть выбор в способе выделения памяти. Там все понятно. Хотелось бы, чтобы кто-то просто и незамысловато приоткрыл этот черный ящик. С удовольствием бы навострил уши вечером за чашечкой крепкого чая с соленой рыбкой.

  • @user-yp8mw9yv1k
    @user-yp8mw9yv1k Год назад

    Шикарно! Проясняет многое в языке.
    Ну и к слову не зря Андрей Столяров настаивает на том что начинать програмировать с Паскаля и освоить работу с указателями в нём. Когда понимаешь что такое указатель и как из них можно собрать хотябы список гораздо проще усвоить вот это поведение пайтона.

  • @ilgizrakhimyanov6546
    @ilgizrakhimyanov6546 2 года назад

    Большое спасибо! Ваши видео приходится пересматривать по несколько раз, даже спустя время

  • @alexandreabramtsev9160
    @alexandreabramtsev9160 2 года назад

    Кстати я слышал другое название - идентификатор. Действительно в каком то смысле в py нет переменных. Хотя.... в некоторых языках есть отдельный тип - pointer - и там это наверное все таки переменная - только хранит не значение а ссылку. А в py происходит автоматическое разименование ссылки в значение. Очень хорошее видео,

  • @user-pc9jp2fs1v
    @user-pc9jp2fs1v 2 года назад

    18:00 - косяк. Функция empty вызывается, на неё не берётся ссылка. Если написать a = empty, b = empty, то getrefcount(empty) вернёт 4

  • @alexeynikolaevskiy5922
    @alexeynikolaevskiy5922 Год назад +1

    Очень интересные моменты. Большое спасибо за это видео!

  • @nuriddinobidjonov5902
    @nuriddinobidjonov5902 2 года назад

    Привет Алексей. Планируете выпускать курс по FastApi? Могу ли узнать примерную дату выпуска?

    • @t0digital
      @t0digital  2 года назад

      Привет, планирую, по дате пока не сориентирую

  • @korshyn05
    @korshyn05 2 года назад

    Алексей, очень круто!
    Если можно, то больше таких видео!

  • @metallurg42
    @metallurg42 2 года назад

    Поясните, пожалуйста, нубу, если все "переменные" хранятся в стеке, каким образом по имени "переменной" интерпретатор определяет адрес памяти, в котором лежит закрепленный за сылкой объект? Снимает со стека имена (ссылки) до тех пор, пока не найдется запрашиваемое, затем восстанавливая стек до первоначального состояния?

  • @VikMoc
    @VikMoc 2 года назад

    Отличное видео! Благодарю за проделанную работу Алексей!!!

  • @user-cc7ve1dy5q
    @user-cc7ve1dy5q 5 месяцев назад

    25 минут видео, чтобы озвучить примерно следующее "В C# существуют две разновидности типов: ссылочные типы и типы значений. В переменных ссылочных типов хранятся ссылки на их данные (объекты), а переменные типа значений содержат свои данные непосредственно. Две переменные ссылочного типа могут ссылаться на один и тот же объект, поэтому операции над одной переменной могут затрагивать объект, на который ссылается другая переменная. При использовании типов значений каждая переменная имеет собственную копию данных, и для операций с одной переменной невозможно повлиять на другую (за исключением inrefслучаев, и out переменных параметров; см. модификатор ref и out). Ну, а в Пайтоне существуют только переменные ссылочного типа, поскольку в Пайтоне всё является объектами".

  • @LeonidKemrin
    @LeonidKemrin 2 года назад

    Сделайте пожалуйста видео про декораторы!

  • @mrpavchu5480
    @mrpavchu5480 2 года назад

    Видео интересное, а обои вообще топ.

  • @user-iv2nc9di8b
    @user-iv2nc9di8b 2 года назад +1

    У вас ошибка на 18:03
    import sys
    def empty():
    pass
    print(sys.getrefcount(empty))
    Вот этот код напечатает 2, и этого, в некотором смысле, достаточно.
    А когда вы делаете
    a = empty()
    b = empty()
    то вы в a и b кладёте ссылки на None, а не на empty. И к той двойке, которую в итоге напечатает код, эти присваивания не имеют никакого отношения.

  • @alexandrameas4436
    @alexandrameas4436 9 месяцев назад

    ТО есть в последнем примере - объект "пустой список" создаётся не при вызове функции, а при её определении?

  • @egoruzh
    @egoruzh 2 года назад

    А как получить общее количество ссылок стека или кучи?

  • @user-ml5dv2zm8r
    @user-ml5dv2zm8r 2 года назад

    Спасибо) Посмотрел как "Спокойной ночи, малыши" - и полезно, и как-то прям успокаивает) /*наверно, просто устал*/

  • @alexeyzhurov7747
    @alexeyzhurov7747 2 года назад +1

    Спасибо за выпуски про работу питона изнутри. Было бы клёво посмотреть про контекстные менеджеры, итераторы и генераторы.

  • @user-cs2lb4pt5e
    @user-cs2lb4pt5e Год назад

    Просто капитальный красавчик

  • @sevashpun
    @sevashpun 2 года назад

    Спасибо за полезное видео. Все четко и внятно объясняешь :)

  • @user-br4vn6id6u
    @user-br4vn6id6u 2 года назад

    интересно, если передать сам список в функцию, то она изменится. а если сделать функцию которая, допустим, увеличивает значение в 10 раз, создать объект и передать в функцию, то он не изменится. почему так?

  • @Slash77100
    @Slash77100 Год назад

    Здравствуйте. А подскажите, пожалуйста, модель микрофона, которую используете.

  • @shurickskalkovich1320
    @shurickskalkovich1320 Год назад

    У вас при подсчете ссылок на empty ошибка. Т.к. вы вызвали empty, для присвоения a и b, то там технически лежат None'ы из-за pass в теле функции. А кол-во ссылок такое из-за объявленной функции и передаче ее, как аргумент, в getrefcount, т.е 2 ссылки. Вы, наверное хотели не вызывать функции, а положить ее в переменные))

  • @denissavast
    @denissavast 2 года назад

    Благодарю ! Молодец за как всегда грамотный вывод и материал !

  • @rlxinc.6016
    @rlxinc.6016 2 года назад +1

    Кстати, есть один довольно интересный момент связанный с функцией .copy()
    Она по возможности копирует копирует ссылки, поэтому при работе со списками списков или кортежем списков может вылезти такая проблема, что по меняв элемент в одной последовательности, у вас изменились внутренности и других.
    Чтобы не попасть в просак лучше в таких случаях использовать .deepcopy(), уж там то гарантированно будут созданы копии и все будет хорошо)

    • @t0digital
      @t0digital  2 года назад

      да, для вложенных структур есть deepcopy

  • @cbrnt4157
    @cbrnt4157 2 года назад +1

    интересное поведение с 6-ю Jack'ами. По сути некорректно ведет себя инициализация значения по умолчанию: интерпретатор зачем-то проверяет существование переменной spisok и не создает ее заново. То есть, правильно так: если не прилетело на вход функции - всегда заново инициировать spisok

  • @gomzaleshuan5260
    @gomzaleshuan5260 2 года назад +1

    прикольно!
    спасибо!
    попробовал тот же код с массивом по умолчанию в функции на JS все отрабатывает как надо. не нужна проверка на None))) что с этим пайтоном не так

  • @user-lz3ez3nn4j
    @user-lz3ez3nn4j 2 года назад

    Спасибо за проделанную работу, лайк, однозначно, и удачи

  • @user-nn4cz1nu8e
    @user-nn4cz1nu8e 2 года назад +2

    Спасибо за контент!