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

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

30.09.2020, 20:45. Показов 2176. Ответов 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 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru