Python Hub - сборище Питонистов
Open in Telegram
Уголок счастья для любого питониста. Сотрудничество или заказы: @leshunist https://shcoder.dev - студия разработки ShcoderDevelopment https://t.me/pythonhub_chat - чат
Show more1 752
Subscribers
-324 hours
+27 days
+430 days
Posts Archive
Новый способ монетизации своих ботов без всяких ЮР. лиц, ип, ОАО, ЗАО бещеки и так далее.
https://youtu.be/SWD0LZwc_kQ
🌟 Global и Nonlocal в Python 🌟
Привет, питонисты! 👋 Сегодня разберём тему, которая частенько вызывает головную боль даже у опытных разработчиков — области видимости переменных и ключевые слова global и nonlocal.
🤔 В чём суть?
Представьте, что вы пишете функцию внутри функции (да, такое бывает!), и вам нужно изменить переменную "снаружи". Без special words Python скажет: "Неа, не получится!" 😅
🎯 Как это работает?
✨ Global:
x = 5 # глобальная переменная
def change_x():
global x # говорим Python, что хотим менять глобальную x
x = 10 # теперь работает!
change_x()
print(x) # выведет 10
🎈 Nonlocal:
def outer():
counter = 0 # переменная внешней функции
def inner():
nonlocal counter # хотим менять counter из outer
counter += 1 # работает!
inner()
print(counter) # выведет 1
outer()
⚡️ Важные моменты:
➡️ Global можно использовать для создания новых переменных
➡️ Nonlocal работает только с существующими переменными
➡️ В Python 3.13 пофиксили баги с global в блоках else и except
🚫 Типичные ошибки:
❌ Неправильно:
def bad_function():
print(x) # ошибка!
global x # global нужно объявлять до использования
x = 10
✅ Правильно:
def good_function():
global x
print(x) # теперь всё ок
x = 10
🛠 Полезные инструменты:
Чтобы проверить, какие переменные у вас есть:
print(globals()) # все глобальные переменные
print(locals()) # все локальные переменные
💡 Практические советы:
- ✨ Используйте global только когда действительно необходимо
- ✨ Nonlocal отлично подходит для счетчиков и аккумуляторов
- ✨ Всегда документируйте использование global и nonlocal в комментариях
- ✨ Старайтесь минимизировать использование глобальных переменных🥳🥳🥳🥳
Пишите идеи, актуальные вам, для видосов в комментах.
https://youtu.be/CGvEkb7CazM
Ура. Разбираемся, как компоновать виджеты во Flet.
Накидывайте идей, что еще сделать!
https://youtu.be/aJ2VYQy57jg
Мораль😎
Атрибуты класса (count) являются общими для всех экземпляров класса.
Метод __del__ вызывается автоматически, когда объект уничтожается (например, после выполнения del или когда программа завершается).
Если объект больше не имеет ссылок, он удаляется сборщиком мусора, и вызывается деструктор.
Разбор 😎
Здесь мы имеем дело с объектами и ссылками в Python. Когда создается объект класса A (a = A()), переменная a ссылается на этот объект. Затем переменной b присваивается ссылка на тот же объект (b = a). Это означает, что a и b ссылаются на один и тот же объект в памяти.
Когда вызывается метод update через переменную b, он изменяет атрибут x этого объекта, увеличивая его значение на 5. Поскольку a и b ссылаются на один и тот же объект, изменение видно через обе переменные. Таким образом, после выполнения b.update(5) значение x становится равным 15, и вывод будет 15 15.
Разбор 😎
В Python списки — это изменяемые объекты. Когда мы присваиваем y = x, переменная y начинает ссылаться на тот же объект в памяти, что и x.
Поэтому любые изменения, сделанные через y, отразятся и на x. В данном случае вызов y.append(4) добавляет элемент 4 в конец списка, на который ссылаются обе переменные.
Таким образом, вывод будет [1, 2, 3, 4].
Разбор😎
Lambda-функции в списке захватывают переменную i из внешней области видимости , а не её значение на момент создания. После завершения цикла i становится равным 2 (последнее значение в range(3)).
Поэтому все функции используют i = 2, и результат для любого вызова funcs[n](1) будет 1 + 2 = 3.
Это типичная "ловушка" при работе с замыканиями в циклах.
Разбор😎
Список lst по умолчанию создается один раз при определении функции, а не при каждом вызове.
Поэтому при первом вызове add_to_list(1) список становится [1], а при втором вызове add_to_list(2) к тому же списку добавляется 2, итог — [1, 2].
Это классическая ловушка с изменяемыми аргументами по умолчанию в Python.
