Понимание последовательности выполнения с генераторами в Python - PullRequest
3 голосов
/ 12 октября 2019

У меня есть простая программа, которую я использую, чтобы понять, как работают генераторы / yeild.

def learn_yield(numbers):
    for i in numbers:
        yield (i*i)

numbers = [5]

sq = learn_yield(numbers)

numbers.append(6)

for i in sq:
    print (i)

Здесь мое понимание неясно:

Метод добавления вызывается после вызова функции learn_yield. Я ожидал бы вывод print (i) как 25, а не

25 36

Как именно число 6 было отправлено в функцию?

Если я переместу numbers.append (6) к циклу for, то получу поведение, которое, я думаю, должно произойти в первую очередь. Означает ли это, что вызов функции выполняется снова, когда цикл повторяется?

Система - ПК, Windows 10 Python - 3,7 Sublime Text

1 Ответ

2 голосов
/ 12 октября 2019

В результате learn_yield сохраняет ссылку от до numbers. Когда вы добавляете к numbers, весь код, имеющий ссылку на него, увидит изменение.

Другими словами, numbers в функции и numbers в основном коде являютсятот же объект .

Если вы хотите разорвать эту ссылку, вы можете сделать learn_yield перебор копии:

def learn_yield(numbers):
    for i in numbers[:]:   # [:] makes a copy
        yield (i*i)

Для подробного обсуждения того, как аргументы передаются вPython, см. Как передать переменную по ссылке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...