|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
||||||
Значение переменной из функции в фунцию28.10.2021, 05:53. Показов 6713. Ответов 23
Метки нет (Все метки)
Всем привет.
Не могу понять, почему значение переменной присвоенной в одной функции не передаётся в другую, хотя почитал уже про это и вроде все возможные причины устранил. Есть основная процедура, в которой выводится окно, к примеру, две кнопки "Выбрать путь" и "Обновить". Если сразу нажимаю "Обновить", то путь берется из переменной folder_from, если нажимаю "Выбрать путь", то открывается окно, в котором пользователь сам выбирает путь и он заносится в переменную mfolder_from. Так вот, при нажатии кнопки "Выбрать путь", переменной mfolder_from присваивается верное значение, это видно в окне вызванным методом messagebox. А вот затем, если мы нажимаем кнопку "Обновить", то переменная mfolder_from оказывается пустой. Почему?
0
|
||||||
| 28.10.2021, 05:53 | |
|
Ответы с готовыми решениями:
23
Вычислить значение функции (значение переменной Х передается в качестве параметра функции)
|
| 28.10.2021, 15:41 | ||||||||||||||||
|
VKont, Для начала. Зачем вы два раза импортируете tkinter? Это бессмысленно.
Теперь по поводу переменных. Вы просто не понимаете как работает global. И не понимаете, что такое области видимости и пространства имен. А так же не понимаете, что такое локальные и глобальные переменные.
Нет, не буду я Вам пересказывать из учебника раздел про локальные и глобальные переменные. Читайте теорию. Единственное, что еще скажу, это то, что инициируемая инструкцией присваивания переменная mfolder_from в функции clck_Path6 является локальной переменной этой функции и ее видно только внутри этой функции. Из другой функции к ней обратится у Вас нельзя. А глобальная переменная mfolder_from из глобальной области у Вас не меняется, так как изнутри функций ее можно только читать, а писать Вы в нее изнутри ничего не можете если не объявили эту переменную глобальной внутри функции (а не в глобальной области, где она и так глобальная). Добавлено через 8 минут VKont, А вообще то, что бы не путаться с глобальными переменными, лучше создать класс и взамен глобальных переменных использовать атрибуты этого класса. Они будут доступны и для чтения и для записи из любого места программы.
1
|
||||||||||||||||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
|||
| 28.10.2021, 15:46 [ТС] | |||
|
Дело в том, что я с другого ЯП пришёл в Python, ну нет у меня времени штудировать учебники, всё на скорую руку, порой проще знающему человеку сказать пару слов что и как, нежели читать талмуты бестолково написанной информации. Ну, а всё же, как мне передавать значение переменной из функции в функцию, можно в двух словах? Я чел понимающий. Добавлено через 2 минуты
0
|
|||
| 28.10.2021, 16:21 | |||||||
|
VKont, Можно через глобальные переменные. Но что бы в функции можно было писать в переменными из глобальной области, нужно сразу после шапки функции указать глобальные переменные для этой функции. Тогда в функции не будет создаваться локальная переменная, а будет идти запись в глобальную переменную.
Причем одна тонкость, если Вы в глобальной области даже не инициализируете эту переменную, то она тогда будет инициализироваться изнутри функции, и помещаться в глобальное пространство имен. И к ней можно будет обращаться для чтения непосредственно из другой функции. Но лучше так не делать, так как Вы потом, через некоторое время, читая код запутаетесь что откуда берется. Да и другие не смогут разобраться с Вашим кодом. Поэтому, если Вы хотите использовать глобальные переменные, то нужно их все инициализировать в начале кода, и работать с ними на запись, если нужно, из функций, объявляя их в функциях , откуда будет производится запись, глобальными. А если владеете ООП, то что бы избежать возможных ошибок, работая с глобальными переменными, вместо них использовать атрибуты класса, специально созданного для использование его атрибутов вместо глобальных переменных. Кликните здесь для просмотра всего текста
Добавлено через 10 минут Моя позиция, что для простеньких программ можно использовать глобальные переменные, инициируя их все в начале кода и используя в функциях global и nonlocal, а в более крупных программах использовать класс для глобальных переменных. Для меня способ с помощью ООП более простой и наглядный, чем использование только функций.
1
|
|||||||
| 04.11.2021, 15:49 | ||||||
|
VKont, Я на днях, перечитывая Лутца, снова натолкнулся на разбор технологий используемых в питоне.
Наследование. Полиморфизм. Инкапсуляция. Если первые два понятия я знал, то с использованием в питоне инкапсуляции решил разобраться. Инкапсуляция и глобальные переменные. Кликните здесь для просмотра всего текста
Из Википедии.
"Инкапсуляция (англ. encapsulation, от лат. in capsula) — в информатике размещение в одном компоненте данных и методов, которые с ними работают. В реализации большинства языков программирования (C++, C#, Java и другие), обеспечивает механизм сокрытия, позволяющий разграничивать доступ к различным компонентам программы. Инкапсуляция зачастую рассматривается как понятие, присущее исключительно объектно-ориентированному программированию (ООП), но в действительности обширно встречается и в других (см. подтипизация на записях и полиморфизм записей и вариантов). В ООП инкапсуляция тесно связана с принципом абстракции данных (не путать с абстрактными типами данных, реализации которых предоставляют возможность инкапсуляции, но имеют иную природу). Это, в частности, влечёт за собой различия в терминологии в разных источниках. В сообществе C++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную. Однако, некоторые языки (например, Smalltalk, Python) реализуют инкапсуляцию, но не предусматривают возможности сокрытия в принципе. Другие (Standard ML, OCaml) жёстко разделяют эти понятия как ортогональные и предоставляют их в семантически различном виде (см. сокрытие в языке модулей ML)." Те, кто так активно выступают против использования глобальных переменных в Питоне, видимо пришли из С++. Однако у Питона более гибкий подход к инкапсуляции. С помощью классов переменные могут быть инкапсулированы в пространстве имен класса, но к ним есть доступ (хотя при желании этот доступ можно и закрыть). Глобальные переменные имеют две негативные особенности. 1) В крупных проектах могут возникать конфликты между глобальными переменными с одинаковыми именами. 2) Может нарушаться алгоритм работы программы, когда не понятно из какого места программы вносятся изменения в глобальную переменную. Первая проблема снимается, если просто вместо глобальных переменных использовать экземпляры класса с атрибутом v, в который записывать значение переменной, тем самым осуществляя инкапсуляцию. Когда переменные в виде атрибутов экземпляров принадлежат разным экземплярам класса, то конфликтов возникать не может. Со второй проблемой можно справиться, если такому экземпляру класса, кроме атрибута v добавить еще атрибут is_used, значением которого является список. И в этот список записывать в виде строки модуль и функцию, из которой осуществляется запись в атрибут v, данного экземпляра класса. Понимая из каких мест идет изменение значения v данного экземпляра класса, будет легко выяснить причину возникновения ошибки. Пример, демонстрирующий использование данной технологии. Кликните здесь для просмотра всего текста
1
|
||||||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
||
| 04.11.2021, 16:00 [ТС] | ||
|
1) Странно, вообще впервые узнаю, что кто-то может додуматься делать в одном проекте одноимённые переменные (не важно глобальные или приватные). Да и те ЯП, которые я даже мал мало затрагивал, подобного не допускали. 2) Для этого и нужен программист, который по ходу чтения кода понимает, откуда заносятся данные в переменные. Если уж очень всё сложно, для подобного существуют комментарии в коде.
0
|
||
| 04.11.2021, 20:44 | |||
|
Кликните здесь для просмотра всего текста
Именно по этой причине стали использоваться независимые модули, каждый из которых может использоваться в различных программах, и при этом не должно возникать конфликта. Но у такого подхода есть и свои минусы, усложняется общая логика работы программы состоящей из множества изолированных модулей. Эта логика все меньше соответствует реальному мышлению человека, где нет таких ограничений. И это мешает созданию искусственного интеллекта, который собственно является моделированием этого человеческого мышления. При мышлении люди используют модульный подход, но только в ограниченных пределах, а не так массово, как сегодня используют независимые модули в программирования.
Я сейчас, стремясь максимально приближать алгоритм к мышлению человека (не программиста) , стал использовать агрегированные модули. Внутри которых свободные связи между файлами модулей, как если бы это был один файл. Такой подход дает возможность избежать ограничений по взаимодействию модулей, которые заставляют программистов для связи использовать функции, которые не естественны для мышления обычного человека.
0
|
|||
|
Супер-модератор
|
||||||||
| 05.11.2021, 16:09 | ||||||||
|
Вот две функции:
Добавлено через 37 минут
0
|
||||||||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
|||
| 06.11.2021, 02:36 [ТС] | |||
|
Добавлено через 6 минут
0
|
|||
| 06.11.2021, 06:48 | ||
|
Добавлено через 28 минут VKont, Питон, благодаря такой динамической типизации, позволяет использовать алгоритмы из реальности, где в процессе выполнения программы меняется тип одной и той же переменной. Например, переменная i имеет тип int, так как значением ее является целое число 3. Но при деление числа 3 на 2, и присваивании результата переменной i , мы получаем уже, что переменная i теперь уже имеет тип float. В языке С++ мы бы должны были заранее объявлять тип переменной i как float. То есть определяя принадлежность к более общему классу, для которого класс int , является подклассом. В питоне же, мы в каждый момент времени имеем у переменной i тот тип, который является более соответствующий реальному числу, находящемуся в переменной в данный момент. Именно поэтому язык питон более точно соответствует объективной реальности, а правильнее сказать, мышлению человека.
0
|
||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
||
| 06.11.2021, 06:55 [ТС] | ||
|
Можно по ходу программы, например, использовать везде переменную i для счётчиков циклов, но думаю никому и в голову не придёт в одной функции/процедуре использовать i для хранения количество карандашей, а в другой для названия цветов этих карандашей. Думаю теперь всё понятно, о чём речь Добавлено через 4 минуты поэтому меня и удивила сама мысль возможности появления глобальных одноимённых переменных в одной программе
0
|
||
| 06.11.2021, 07:39 | ||
|
Добавлено через 10 минут VKont, Именно для того, что бы конфликта имен не случилось, а так же всегда можно было четко понять алгоритм работы программы и как используется одна и та же глобальная переменная в крупных проектах, я и предлагаю в качестве глобальный переменных использовать атрибуты специального класса, с помощью которого и определять такие глобальные переменные, которые будут доступны для записи и чтения из любого места в проекте и при этом не могут создавать конфликтов и быть прозрачными для понимания когда и какой функцией идет запись в эти переменные.
0
|
||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
|
| 06.11.2021, 07:46 [ТС] | |
|
Viktorrus ну я то вас понял и вроде как уже разобрались с переменными в среде Python, я продолжил это Catstail на довольно странный вопрос "в каких это ЯП нельзя иметь две и более одноимённые переменные?"
0
|
|
| 06.11.2021, 07:50 | |
|
VKont, А для того, чтобы избежать конфликта имен, при названии таких классов одним именем, нужно импорт осуществлять используя синтаксис import <модуль>, или в имя класса добавлять имя модуля GV_module1.
0
|
|
|
Супер-модератор
|
|||||||
| 06.11.2021, 08:27 | |||||||
|
Я-то программист... А вот у тебя, милок, будут проблемы, если так умеешь формулировать свои мысли. ![]() "Странно, вообще впервые узнаю, что кто-то может додуматься делать в одном проекте одноимённые переменные (не важно глобальные или приватные). Да и те ЯП, которые я даже мал мало затрагивал, подобного не допускали." - Вот пример из C++
0
|
|||||||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
||||
| 06.11.2021, 08:53 [ТС] | ||||
Недотёпы криворукие недопрограммисты, используя переменную и для того и для этого и для третьего, если даже вдруг и ЯП это позволяет...у нас бы с кафедры сразу вылетел за такой код.Добавлено через 9 минут грубейшую ошибку с одноименными переменными выдавать за возможности ЯП...мне бы стыдно стало перед молодыми людьми только начинающими путь в мире программирования, а уж асы бы тухлыми яйцами закидали
0
|
||||
|
|
||
| 06.11.2021, 09:29 | ||
|
0
|
||
|
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
|
||
| 06.11.2021, 09:40 [ТС] | ||
|
Я не собираюсь чьи-то мнения превозносить, а чьими-то пренебрегать, я не за этим здесь нахожусь. А по поводу информации от Victorrus, очень даже полезная и дельная, видно, что человек в теме. Всем спасибо, кто помогает и не только в этой ветке, а вообще на форуме.
0
|
||
|
Супер-модератор
|
||
| 06.11.2021, 09:43 | ||
|
1) просто неумение выражать свои мысли (что странно, поскольку возраст-то уже не детский) 2) непонимание самой сути императивного программирования Тебе все разжевали (глобальные переменные, области видимости и времена жизни, return, использование объектов). Как говорится - Sapienti sat (умному достаточно). Я бы не стал вообще ввязываться в эту дискуссию, если бы не вопрос "как передать значение из функции в функцию". Он, что называется - бросается в глаза. И не одному мне (dondublon)
0
|
||
| 06.11.2021, 09:43 | |
|
Помогаю со студенческими работами здесь
20
Вывести на экран значение функции в зависимости от переменной. И найти максимальное значение Составьте программу, которая: запрашивает значение переменной x и шага n; выводит значение функции Составте программу, которая:запрашивает значение переменной X и шага Y;выводит значение функции f(x)=(2x-cosx): (x+1) в точках х,х+n,х-n. Как посчитать и запомнить значение переменной в одной функции, а потом использовать ее в другой функции?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|