В списке аргументов выражения оцениваются слева направо, поэтому в:
plt.plot( range( len( (Y := foo) )), Y )
первый аргумент range( len( (Y := foo) ))
оценивается перед вторым аргументом Y
, и поэтому Y
определяется с помощью foo
перед тем, как Y
упоминается как второй аргумент.
Однако в условном выражении выражение в выражении if
вычисляется до того, как будет выполнено вычисление любого из выходных выражений, поэтому в :
(l := len(foo)) // 16 + 0 if l%16 == 0 else 1
l%16 == 0
вычисляется первым, и, поскольку l
еще не определено в этой точке, оно вызывает указанное NameError
.
Вместо этого можно определить l
в предложении if
сначала, если это действительно логин c, который вы хотите:
for i in range( l // 16 + 0 if (l := len(foo))%16 == 0 else 1 ):