No Python, vi dois valores de variáveis trocados usando esta sintaxe:
left, right = right, left
Essa é considerada a maneira padrão de trocar dois valores de variável ou há algum outro meio pelo qual duas variáveis são por convenção geralmente trocadas?
python
syntax
swap
conventions
WilliamKF
fonte
fonte
Respostas:
Isso significa o seguinte para a expressão
a,b = b,a
:b,a
é avaliado, ou seja, uma tupla de dois elementos é criada na memória. Os dois elementos são os objetos designados pelos identificadoresb
ea
que existiam antes da instrução ser descoberta durante a execução do programa.a
seja atribuído ao primeiro elemento da tupla (que é o objeto que era formalmente b antes da troca porque tinha nomeb
)e o o segundo identificador
b
é atribuído ao segundo elemento da tupla (que é o objeto que era anteriormente um antes da troca porque seus identificadores erama
)Esse mecanismo efetivamente trocou os objetos atribuídos aos identificadores
a
eb
Portanto, para responder à sua pergunta: SIM, é a maneira padrão de trocar dois identificadores em dois objetos.
A propósito, os objetos não são variáveis, são objetos.
fonte
a, b, c = c, a, b
.Essa é a maneira padrão de trocar duas variáveis, sim.
fonte
Conheço três maneiras de trocar variáveis, mas
a, b = b, a
é a mais simples. Há simXOR (para números inteiros)
Ou concisa,
Variável temporária
Troca de tupla
fonte
code
x = x + yy = xy x = xycode
Eu não diria que é uma maneira padrão de trocar porque causará alguns erros inesperados.
nums[i]
será modificado primeiro e depois afetará a segunda variávelnums[nums[i] - 1]
.fonte
var c=a
,a=b
,b=c
. E então, a última tarefa usará o novo valor dea
para avaliar o endereço de b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Resolveria o problema.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: O problema é quando o python faz a atribuição do lado esquerdo,nums[i]
é alterado, o que causanums[nums[i] - 1]
alterações inesperadas. Você pode imaginar a princípio que desejanums[1],nums[2] = nums[2],nums[1]
, mas depois danums[1] = nums[2]
corrida, você não precisa maisnums[2] = nums[1]
, em vez disso, conseguiunums[888] = nums[1]
.Não funciona para matrizes multidimensionais, porque as referências são usadas aqui.
Consulte também Trocar fatias de matrizes Numpy
fonte
Para contornar os problemas explicados pelo eyquem , você pode usar o
copy
módulo para retornar uma tupla contendo cópias (revertidas) dos valores, através de uma função:Mesma função que
lambda
:Em seguida, atribua-os aos nomes desejados, assim:
NOTA: se você quiser, poderá importar / usar em
deepcopy
vez decopy
.fonte
Você pode combinar trocas de tupla e XOR : x, y = x ^ x ^ y, x ^ y ^ y
ou
Usando lambda :
Resultado:
fonte