Percebo que um operador de pré-incremento / decremento pode ser aplicado a uma variável (como ++count
). Compila, mas na verdade não altera o valor da variável!
Qual é o comportamento dos operadores de pré-incremento / decremento (++ / -) no Python?
Por que o Python se desvia do comportamento desses operadores visto em C / C ++?
++
e--
operadores?sta x++
... a instrução atômica resultante armazena oa
acumulador para ondex
está apontando e depois é incrementadax
pelo tamanho do acumulador. Isso é feito porque é mais rápido que a aritmética do ponteiro, porque é muito comum e é fácil de entender. Ambos pré e pós.Respostas:
++
não é um operador. São dois+
operadores. O+
operador é o operador de identidade , que não faz nada. (Esclarecimento: os operadores unários+
e-
trabalham unicamente em números, mas presumo que você não esperaria que um++
operador hipotético trabalhasse em seqüências de caracteres.)Analisa como
O que se traduz em
Você precisa usar o
+=
operador um pouco mais para fazer o que deseja:Eu suspeito que os operadores
++
e--
foram deixados de fora por consistência e simplicidade. Não conheço o argumento exato que Guido van Rossum deu para a decisão, mas posso imaginar alguns argumentos:++count
é ambígua, como poderia ser+
,+
,count
(dois unárias+
operadores) tão facilmente como poderia ser++
,count
(um unário++
operador). Não é uma ambiguidade sintática significativa, mas existe.++
nada mais é do que um sinônimo+= 1
. Foi uma taquigrafia inventada porque os compiladores C eram estúpidos e não sabiam otimizara += 1
asinc
instruções que a maioria dos computadores possui. Neste dia de otimização de compiladores e linguagens interpretadas por bytecode, a adição de operadores a uma linguagem para permitir que os programadores otimizem seu código geralmente é desaprovada, especialmente em uma linguagem como Python, projetada para ser consistente e legível.++
operadores é misturar as diferenças (tanto na precedência quanto no valor de retorno) entre os operadores de pré e pós-incremento / decremento, e o Python gosta de eliminar a linguagem "pegadinha" -s. As questões de precedência do pré / pós-incremento em C são bem cabeludas e incrivelmente fáceis de estragar.fonte
+
operador unário tem um uso. Para objetos decimais. Decimais, ele arredonda para a precisão atual.+ +
e++
sem quebrar o LL (1).++
nada mais é do que um sinônimo+= 1
. Existem variantes de pré-incremento e pós-incremento de ++, portanto, claramente não é a mesma coisa. Eu concordo com o resto de seus pontos, no entanto.Quando você deseja incrementar ou diminuir, normalmente você deseja fazer isso em um número inteiro. Igual a:
Mas em Python, números inteiros são imutáveis . Ou seja, você não pode mudá-los. Isso ocorre porque os objetos inteiros podem ser usados sob vários nomes. Tente o seguinte:
aeb acima são realmente o mesmo objeto. Se você incrementasse a, também incrementaria b. Não é isso que você quer. Então você tem que reatribuir. Como isso:
Ou mais simples:
O qual será reatribuído
b
parab+1
. Esse não é um operador de incremento, porque não incrementab
, ele o reatribui.Resumindo: o Python se comporta de maneira diferente aqui, porque não é C e não é um invólucro de baixo nível em torno do código de máquina, mas uma linguagem dinâmica de alto nível, onde incrementos não fazem sentido e também não são tão necessários quanto em C , onde você os usa sempre que tiver um loop, por exemplo.
fonte
i++
significaria atribuiri + 1
à variáveli
.i = 5; i++
significa atribuir6
ai
, não modificar oint
objeto apontado pori
. Ou seja, não significa aumentar o valor de5
!i++
opera apenas em lvalues. Se se pretendesse incrementar o objeto apontado pori
, essa restrição seria desnecessária.Enquanto as outras respostas estão corretas na medida em que mostram o que um mero
+
geralmente faz (a saber, deixe o número como está, se for um), elas estão incompletas na medida em que não explicam o que acontece.Para ser exato,
+x
avalia parax.__pos__()
e++x
parax.__pos__().__pos__()
.Eu poderia imaginar uma estrutura de classe MUITO estranha (Filhos, não faça isso em casa!) Assim:
fonte
O Python não possui esses operadores, mas se você realmente precisar deles, poderá escrever uma função com a mesma funcionalidade.
Uso:
Dentro de uma função, você precisa adicionar locals () como um segundo argumento se quiser alterar a variável local, caso contrário, ela tentará mudar global.
Também com estas funções você pode fazer:
Mas, na minha opinião, a seguinte abordagem é muito mais clara:
Operadores de redução:
Eu usei essas funções no meu módulo traduzindo javascript para python.
fonte
Wikipedia
Portanto, ao introduzir esses operadores, você quebraria a divisão de expressão / instrução.
Pela mesma razão, você não pode escrever
como você pode em outros idiomas onde essa distinção não é preservada.
fonte
if (n := len(a)) > 10: y = n + 1
por exemplo. Note-se que a distinção é clara por causa da introdução de um novo operador para o efeito (:=
)TL; DR
O Python não possui operadores de incremento / decremento unários (
--
/++
). Em vez disso, para incrementar um valor, useMais detalhes e dicas
Mas tenha cuidado aqui. Se você vem de C, mesmo isso é diferente em python. O Python não possui "variáveis" no sentido em que C possui; em vez disso, o python usa nomes e objetos , e no python
int
s são imutáveis.então vamos dizer que você faz
O que isso significa em python é: crie um objeto do tipo
int
com valor1
e vincule o nomea
a ele. O objeto é uma instância deint
ter valor1
e o nomea
se refere a ele. O nomea
e o objeto ao qual ele se refere são distintos.Agora vamos dizer que você faz
Como
int
s são imutáveis, o que acontece aqui é o seguinte:a
se refere (é umint
com id0x559239eeb380
)0x559239eeb380
(é1
)int
objeto com valor2
(ele possui o ID do objeto0x559239eeb3a0
)a
a este novo objetoa
se refere ao objeto0x559239eeb3a0
e o objeto original (0x559239eeb380
) não é mais referido pelo nomea
. Se não houver outros nomes referentes ao objeto original, ele será coletado posteriormente.Experimente você mesmo:
fonte
Sim, eu senti falta da funcionalidade ++ e - também. Alguns milhões de linhas de código c enraizaram esse tipo de pensamento na minha cabeça antiga e, em vez de combatê-lo ... Aqui está uma classe que eu desenvolvi que implementa:
Aqui está:
Você pode usá-lo assim:
... já tendo c, você poderia fazer isso ...
....ou apenas...
... e para (re) atribuição em número inteiro ...
... enquanto isso manterá c como contador de tipo:
EDITAR:
E também há esse comportamento inesperado (e completamente indesejado) ,
... porque dentro dessa tupla, getitem () não é o usado, em vez disso, uma referência ao objeto é passada para a função de formatação. Suspiro. Assim:
... ou, mais verbalmente e explicitamente, o que realmente queríamos que acontecesse, embora contra-indicado na forma real pela verbosidade (use em
c.v
vez disso) ...fonte
Não há operadores pós / pré-incremento / decremento em python, como em linguagens como C.
Podemos ver
++
ou--
como múltiplos sinais sendo multiplicados, como fazemos em matemática (-1) * (-1) = (+1).Por exemplo
Analisa como
O que se traduz em
Porque, multiplicação de
-
sinal com-
sinal é+
E finalmente,
fonte
-----count
.No python 3.8+, você pode fazer:
Você pode pensar muito com isso.
Ou, se você quiser escrever algo com sintaxe mais sofisticada (o objetivo não é otimização):
É bem retornado 0 se não existir sem erros e, em seguida, será definido como 1
fonte