Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
6 / 5 / 2
Регистрация: 14.10.2014
Сообщений: 79

Область видимости списков

30.09.2020, 20:45. Показов 2158. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Делаю первые шаги в змеином языке. Столкнулся с явлением, которое если и не противоречит учебникам, то там явно не описаны. Речь об области видимости списков. Создал в основной линии пустой список. Во внешней процедуре наполнил его данными методом .append и далее в основной линии вывел его через print. И данные все были выведены корректно! Только потом я сообразил, что в функции не обозначил этот список глобальным через global. Соответственно это опыт не противоречит тому, что внутри функций глобальные переменные видны, но для возможности их изменения внутри функций, нужно использовать global. Или списков (или конкретно метода .append) это не касается? Сильно не пинайте начинающего, и про не желательность менять глобальные переменные в функциях, я тоже в курсе. Интересует само положение вещей.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2020, 20:45
Ответы с готовыми решениями:

Область видимости переменных/списков
Написал код для простого калькулятора, при попытке запуска в консоли выводится следующее сообщение: Traceback (most recent call last): ...

Область видимости
есть некий код: class test(object): import test2 def __init__(self): self.value = 10 test2.py

Область видимости
Есть функция которая определяет простое или не простое число def prost (a): sp= for i in range(1, a+1): if a%i==0: ...

9
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.10.2020, 06:19
Цитата Сообщение от streker Посмотреть сообщение
Или списков (или конкретно метода .append) это не касается?
Списки иммунабельны, так что всё ок. То есть вы передали куда-то (в функцию) на самом деле ссылку на список и уже через list.append() добавили новые элементы в список.

Python
1
2
3
4
5
6
7
8
>>> def f(l): l.append(42)
... 
>>> ls = []
>>> ls
[]
>>> f(ls)
>>> ls
[42]
С примитивными типами у вас так не получится
Python
1
2
3
4
5
6
7
8
>>> def f(s): s += '42'  
... 
>>> st = '' 
>>> st
''
>>> f(st)
>>> st
''
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
01.10.2020, 08:23
Лучший ответ Сообщение было отмечено streker как решение

Решение

Цитата Сообщение от streker Посмотреть сообщение
Интересует само положение вещей.
если кратко (я если что не Лутц, у него разжевано) то в своих функциях ты можешь смотреть глобальные переменные и что-то с ними делать если при этом не переприсваиваешь переменную. То есть как только ты пишешь = для такой ссылки, то получишь ошибку если не использовал оператор global.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set_ = set()
dict_ = {}
a_list = []
 
 
def change():
    set_.add("1")
    dict_["1"] = 1
    a_list.append(1)
 
 
if __name__ == '__main__':
    print(set_, dict_, a_list)
    change()
    print(set_, dict_, a_list)
ответ
Python
1
2
set() {} []
{'1'} {'1': 1} [1]
Плавно переходим к неизменяемости типов (иммутабельности). В примере выше все типы изменяемые, то есть при внесении изменений как указано в функции change() ссылка на саму коллекцию не меняется, потому такие операции ты можешь выполнять без global на любой вложенности. Но как только ты попробуешь написать set_ = set(), set_=None или del set_ внутри функции - интерпретатор вывалит ошибку, ибо ты покусился на святое -на ссылку и не предупредил что это глобалка.

С неизменяемыми типами это НЕ работает. Возьмем к примеру строку или инт, каждый раз когда ты их меняешь, название переменной у тебя остается, но по факту ссылка меняется, ибо создается новый объект. Потому для неизменяемых типов ты сможешь только посмотреть их внутри функций, но для любых изменений нужен global

ни фига наверное не понятно объяснил?)))
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
01.10.2020, 10:21
streker, что ж вас всех к глобалкам-то тянет. Не используйте их. Забудьте, как детские болезни.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
01.10.2020, 10:23
dondublon, так с ними потому что просто, особенно когда у тебя весь код на 10 строк. Может ничего и не случиться... а вот как начнет что-то посерьезнее писать так и осознает всю боль так сказать неосторожной глобалки
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
01.10.2020, 10:37
Welemir1, это точно.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.10.2020, 10:49
Цитата Сообщение от Welemir1 Посмотреть сообщение
осознает всю боль так сказать неосторожной глобалки
Пф... К тому времени поди человек узнает об ООП и будет использовать self.*
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
01.10.2020, 11:01
Рыжий Лис, ой не факт. Ведь с глобалками так просто без всех этих селфов
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
01.10.2020, 13:32
Рыжий Лис, я тут поддержу dondublon, вы и сами видели тут на форуме -никакие ООП и лямбды не мешают юному питонисту ввернуть глобал куда-нибудь поглубже и потом удивляться. Впрочем, это совсем другая история, ТС вроде бы не из таких.
0
6 / 5 / 2
Регистрация: 14.10.2014
Сообщений: 79
01.10.2020, 19:15  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
ТС вроде бы не из таких.
Ой, боюсь не оправдать вашего доверия. Полжизни писал на ассемблере для микроконтроллеров, поэтому я махровый процедурщик и с ООП я на ВЫ с очень большой буквы. Одно только отсутствие меток и условного/безусловного передачи управления, уже полголовы седых волос стоило. Поэтому мой код что на питоне что на делфи, пока что способен вызвать инфаркт у профи

Объяснение ваше понял, иммутабельность типов в моих учебниках как то была опущена, поэтому закрываем пробелы опытным путем и советами добрых людей. Спасибо!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2020, 19:15
Помогаю со студенческими работами здесь

Область видимости переменных
Приветствую! Переменная temp_value не видна в блоке except. Можно ли это исправить не создавая эту переменную вне цикла? my_list = ...

Область видимости функции
Всем доброго.Имеется функция avtoriz,которая с label возвращает значение в переменную log.Подскажите,как кроме объявления глобальной...

Область видимости переменной в цикле for
Почему переменная объявленная в цикле for доступна за пределами этого цикла: for i in range(10): pass print(i) #Выведет 9 ...

Область видимости переменных в функциях
не понимаю почему функция : def example(arr): arr = "ТАК ВЕДЬ БЫТЬ НЕ ДОЛЖНО" arr = mirror(arr) print(*arr) ...

Вывести переменную в область видимости и о циклическом импорте
Привет.есть вопрос .касаемо скорее всего циклического импорта основная программа app.py из нее в дочернюю proba88.py импортируется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru