список понимания в python2 работает нормально, но я получаю ошибку в python3 - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий код, использующий полный список:

x = int ( input())  
y = int ( input()) 
z = int ( input())
n = int ( input()) 


ret_list = [ (x,y,z) for x in range(x+1) for y in range(y+1) for z in 
range(z+1) if x+y+z!=n ]
print(ret_list)

в python2 работает как положено.Однако в python3 я получаю следующую ошибку:

print([ (x,y,z) for x in range(x+1) for y in range(y+1) for z in range(z+1) if 
x+y+z!=n ])
File "tester.py", line 16, in <listcomp>
print([ (x,y,z) for x in range(x+1) for y in range(y+1) for z in range(z+1) if 
x+y+z!=n ])
UnboundLocalError: local variable 'y' referenced before assignment

Мне просто интересно, что я делаю неправильно.Я мог бы что-то упустить в Python3, хотя это прекрасно работает в Python2.Спасибо.

1 Ответ

0 голосов
/ 09 октября 2018

Поскольку x y и z определены как "локальные" переменные в понимании списка, Python 3 рассматривает их как таковые и не использует / не видит глобальное значение.

Python 2 не имеет такой разницы (следовательно, переменная «утечка», которую некоторые наблюдали при выходе из понимания), и он ведет себя точно так же, как если бы вы использовали нормальные циклы

Это лучше объяснить здесь: PythonПонимание списков связывает имена даже после того, как охват понятен.Это правильно?

Что действительно смешно, так это то, что питон сначала жалуется на y, а не x.Ну, так как мне любопытно, я задал этот вопрос здесь: почему UnboundLocalError возникает во второй переменной плоского понимания?

Правильный способ сделать это - использовать разныеимена переменных для ваших индексов цикла (не уверен, что выбранные имена очень хороши, но по крайней мере это работает независимо от версии Python):

ret_list = [ (x1,y1,z1) for x1 in range(x+1) for y1 in range(y+1) for z1 in range(z+1) if x1+y1+z1!=n ]
...