Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2020, 15:25   #1
Habi
Новичок
Джуниор
 
Регистрация: 19.08.2020
Сообщений: 1
По умолчанию Читая книгу Марк Саммерфилда наткнулся на код: Помогите разобраться с кодом

Читая книгу Марк Саммерфилда наткнулся на код:
Код:
import random
def get_forenames_and_surnames():
    forenames = []
    surnames = []
    for names, filename in ((forenames, "/data/forenames.txt"), (surnames, "/data/surnames.txt" )): 
        for name in open (filename):
            names.append(name.rstrip()) 
    return forenames, surnames

forenames, surnames = get_forenames_and_surnames() 
fh = open ("/data/pytest-names1.txt", "w")
for i in range (100):
    line = "{0} {1} \n".format (random.choice (forenames), random.choice(surnames))
    fh.write(line)
Код работает на отлично. Только вот понять не могу:
1) во внешнем цикле for...in переменная names приобретает type(list), хотя эта переменная names нигде не объявлена списком.
2) Также в списки forenames и surnames добавляется новые элементы из файла, хотя для этих списков тоже нигде не указан метод append.
Как и в каком месте кода происходит связь между переменной names и forenames, surnames?
Помогите разобраться с кодом. Спасибо
Habi вне форума Ответить с цитированием
Старый 20.08.2020, 15:26   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Habi Посмотреть сообщение
во внешнем цикле for...in переменная names приобретает type(list), хотя эта переменная names нигде не объявлена списком.
В Python динамическая типизация - какое значение присвоили, такой и тип. А значения names получает из списка цикла, то есть forenames и surnames, а им явно присвоен пустой список.

Цитата:
Сообщение от Habi Посмотреть сообщение
Как и в каком месте кода происходит связь между переменной names и forenames, surnames?
Вот в момент присваивания и происходит. Объекты в Python присваиваются по ссылке, поэтому когда в цикле фактически выполняется
Код:
names = forenames
они начинают указывать на один и тот же список
Black Fregat вне форума Ответить с цитированием
Старый 21.08.2020, 15:30   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Поскольку и самому было интересно разобраться в этом коде, то приведу более подробное описание.
Проще посмотреть на работу функции.
Код:
    forenames = []
    surnames = []
Тут готовятся пустые объекты типа список, в которые потом, например, можно будет добавлять данные.
Сами переменные forenames и surnames содержат ссылки на эти пустые объекты.
В цикле
Код:
for names, filename in ((forenames, "/data/forenames.txt"), (surnames, "/data/surnames.txt" )):
переменные цикла names и filename получают ссылки на объекты:
Шаг 1 - names ==> forenames, а filename ==> "/data/forenames.txt"
Шаг 2 - names ==> surnames, а filename ==> "/data/surnames.txt"
поскольку за in следует вложенный список, то из него извлекаются элементы (списки).
Ссылки на элементы вложенного списка и передаются переменным цикла.
Во вложенном цикле
Код:
for name in open (filename):
    names.append(name.rstrip())
в список, на который ссылается names, добавляются элементы, полученные из файла, на который указывает переменная filename.
Т.к. вначале переменная names ссылается на пустой список, на который ссылается и forenames, то пустой список заполняется значениями из файла "/data/forenames.txt".
Теперь переменная forenames ссылается на не пустой список.
На втором шаге внешнего цикла переменная names ссылается на пустой список surnames. Он так же заполняется данными, но из файла "/data/surnames.txt".
После выполнения строки
Код:
forenames, surnames = get_forenames_and_surnames()
имеем два списка, которые заполнены значениями из соответствующих файлов.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом С++ Falcome Помощь студентам 1 25.03.2020 18:38
Помогите разобраться с кодом Yessenbek Помощь студентам 1 17.09.2019 11:55
Помогите разобраться с кодом Viktoria14 Lazarus, Free Pascal, CodeTyphon 3 28.12.2017 20:18
Помогите разобраться с кодом Coolmem PHP 23 22.04.2015 15:07
Помогите разобраться с кодом С++ Noor Помощь студентам 20 10.10.2007 17:42