Почему eval в Python 3 не видит переменные вне генератора списков?

Использую Python 3.5.2, недавно решил портировать старое приложение с Python 2.7, и внезапно обнаружил эту странную особенность в новом питоне.
>>> def evaluate1(x, ev):
	x = np.array(x)
	n = 2
	return x[eval(ev)].size

>>> evaluate1([0,1,2,3], '(x==2)') # тут все норм
1
>>> evaluate1([0,1,2,3], '(x==n)') # и здесь
1

>>> def evaluate2(x, ev): # немного усложним
	x = [np.array(x)]
	n = 2
	return [i[eval(ev)].size for i in x]

>>> evaluate2([0,1,2,3], '(i==2)') # тут тоже все по плану
[1]
>>> evaluate2([0,1,2,3], '(i==n)') # а тут переменной n уже не видать
Traceback (most recent call last):
  File "<pyshell#229>", line 1, in <module>
    evaluate2([0,1,2,3], '(i==n)')
  File "<pyshell#223>", line 4, in evaluate2
    return [i[eval(ev)].size for i in x]
  File "<pyshell#223>", line 4, in <listcomp>
    return [i[eval(ev)].size for i in x]
  File "<string>", line 1, in <module>
NameError: name 'n' is not defined

>>> n = 2 # а если объявить глобальную переменную, то я...
>>> evaluate2([0,1,2,3], '(i==n)') # ...перестаю что-либо понимать...
[1]

>>> def evaluate(x, ev): # а если убрать eval, то все верно
	x = [np.array(x)]
	n = 2
	return [i[i==n].size for i in x]
>>> evaluate([0,1,2,3], '(i==n)')
[1]

У меня одного так по особому работает Python 3.5.2 или же это так и должно быть?
  • Вопрос задан
  • 380 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы