En Python, j'ai vu deux valeurs de variables échangées à l'aide de cette syntaxe:
left, right = right, left
Est-ce considéré comme le moyen standard d'échanger deux valeurs de variable ou existe-t-il un autre moyen par lequel deux variables sont, par convention, le plus souvent échangées?
python
syntax
swap
conventions
WilliamKF
la source
la source
Réponses:
Cela signifie ce qui suit pour l'expression
a,b = b,a
:b,a
est évalué, c'est-à-dire qu'un tuple de deux éléments est créé dans la mémoire. Les deux éléments sont les objets désignés par les identifiantsb
eta
qui existaient avant que l'instruction ne soit rencontrée lors d'une exécution de programmea
soit attribué au premier élément du tuple (qui est l'objet qui était formellement b avant le swap parce qu'il avait un nomb
)et le le deuxième identifiant
b
est attribué au deuxième élément du tuple (qui est l'objet qui était auparavant un avant le swap car ses identifiants l'étaienta
)Ce mécanisme a effectivement échangé les objets attribués aux identifiants
a
etb
Donc, pour répondre à votre question: OUI, c'est la manière standard d'échanger deux identifiants sur deux objets.
Soit dit en passant, les objets ne sont pas des variables, ce sont des objets.
la source
a, b, c = c, a, b
.C'est la façon standard d'échanger deux variables, oui.
la source
Je connais trois façons d'échanger des variables, mais
a, b = b, a
c'est la plus simple. Il y aXOR (pour les entiers)
Ou de façon concise,
Variable temporaire
Échange de tuple
la source
code
x = x + yy = xy x = xycode
Je ne dirais pas que c'est un moyen standard d'échanger car cela entraînera des erreurs inattendues.
nums[i]
sera modifié en premier, puis affectera la deuxième variablenums[nums[i] - 1]
.la source
var c=a
,a=b
,b=c
. Et puis, la dernière affectation utilisera la nouvelle valeur dea
pour évaluer l'adresse de b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Résoudrait le problème.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: Le problème est lorsque python effectue l'affectation de gauche,nums[i]
est modifié, ce qui entraîne unenums[nums[i] - 1]
modification inattendue. Vous pouvez imaginer au début que vous vouleznums[1],nums[2] = nums[2],nums[1]
, mais après lanums[1] = nums[2]
course, vous n'en avez plusnums[2] = nums[1]
, à la place vous aveznums[888] = nums[1]
.Ne fonctionne pas pour les tableaux multidimensionnels, car les références sont utilisées ici.
Voir aussi Swap slices of Numpy arrays
la source
Pour contourner les problèmes expliqués par eyquem , vous pouvez utiliser le
copy
module pour renvoyer un tuple contenant des copies (inversées) des valeurs, via une fonction:Même fonction qu'un
lambda
:Ensuite, attribuez-les aux noms souhaités, comme ceci:
REMARQUE: si vous le souhaitez, vous pouvez importer / utiliser
deepcopy
au lieu decopy
.la source
Vous pouvez combiner des swaps de tuple et XOR : x, y = x ^ x ^ y, x ^ y ^ y
ou
Utilisation de lambda :
Production:
la source