Использую 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 или же это так и должно быть?