Как объяснить этот результат цикла в Python? - PullRequest
1 голос
/ 19 сентября 2011
x=range(1,4)
y=range(1,4)


[(xi,yi) for xi in x for yi in y if xi is yi]
 #output
 # [(1, 1), (2, 2), (3, 3)]

[(xi,yi) for xi in x if xi is yi for yi in y ]
 #output, I am confused about this one
 #[(3, 1), (3, 2), (3, 3)]

Может ли кто-нибудь объяснить, почему второй цикл приводит к таким результатам?

Я довольно озадачен тем, как работают несколько встроенных циклов в Python.

Кроме того, любой учебник попредпочтительнее встроенные циклы python

Ответы [ 2 ]

7 голосов
/ 19 сентября 2011

Вторая конструкция сама по себе не является допустимым кодом:

In [1]: x=range(1,4)

In [2]: y=range(1,4)

In [3]: [(xi,yi) for xi in x if xi is yi for yi in y ]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/aix/<ipython console> in <module>()

NameError: name 'yi' is not defined

yi в xi is yi не относится к yi, который идет после этого. Он ссылается на ранее существовавшую переменную под названием yi (по крайней мере, так происходит во время самой первой итерации).

Единственная причина, по которой код работал на вас, заключалась в том, что вы ранее запустили первую конструкцию, которая оставила yi (установлен на 3) в глобальном пространстве имен.

0 голосов
/ 19 сентября 2011

Вот точка, второй цикл запускается после первого, когда я работал с этим.

yi на самом деле 3 в локальной области.

Если запустить их один, второй вызовет ошибку.

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