Por que os valores negativos k
estão sendo impressos como o valor original, mas quando entramos no reino positivo, fica estranho?
Em:
def j(k):
for i in range(i:=k):
i+=i
print(i)
for i in [-5,-4,-3,-2,-1,0,1,2,3,4,5]:
j(i)
Fora:
-5
-4
-3
-2
-1
0
0
2
4
6
8
Isso não tem nada a ver com o operador walrus; na verdade, pode ser mais fácil de entender sem ele.
A estranheza dos números negativos ocorre porque, para qualquer valor não positivo
k
, ,range(k)
é vazio. Isso significa que o laço for é ignorado,j(k)
imprimindo apenask
.Para valores positivos
k
, o comportamento ocorre porque o valori
na instrução for é o mesmo quei
você declarou fora do loop. Cada iteração do loop for reatribuii
ao próximo valor no intervalo, substituindo quaisquer alterações anteriores, portanto, a única iteração que importa é a última.Na última iteração, o próprio loop for atribui,
i=k-1
já que esse é o último valor no intervalo. Em seguida,i+=i
dobra esse valor, entãoi==2*(k-1)
. Então, o loop termina, masi
mantém esse valor e é impresso.Na verdade, seu código é equivalente ao seguinte:
O que resulta na saída para
[-5,-4,-3,-2,-1,0,1,2,3,4,5]
-5, -4, -3, -2, -1, 0, 0, 2, 4, 6, 8.