是否有标准化的方法在Python中交换两个变量?

问题描述 投票:282回答:6

在Python中,我看到使用这种语法交换了两个变量值:

left, right = right, left

这被认为是交换两个变量值的标准方法,还是有一些其他方法可以按惯例最常交换两个变量?

python syntax swap conventions
6个回答
328
投票

Python从左到右评估表达式。请注意,在评估分配时,右侧在左侧之前进行评估。

http://docs.python.org/3/reference/expressions.html#evaluation-order

这意味着以下表达式a,b = b,a

  • 评估右侧的b,a,也就是说在内存中创建了两个元素的元组。这两个元素是由标识符ba指定的对象,它们在执行程序期间在指令被激活之前存在
  • 在创建这个元组之后,还没有对这个元组对象进行任何赋值,但是没关系,Python内部知道它在哪里
  • 然后,评估左侧,也就是说元组被分配到左侧
  • 由于左侧由两个标识符组成,因此将元组解压缩,以便将第一个标识符a分配给元组的第一个元素(这是在交换之前为b的对象,因为它具有名称b) 并且第二个标识符b被分配给元组的第二个元素(这是以前在交换之前的对象,因为它的标识符是a

这种机制有效地交换了分配给标识符ab的对象

所以,回答你的问题:是的,这是在两个对象上交换两个标识符的标准方法。 顺便说一下,对象不是变量,它们是对象。


103
投票

这是交换两个变量的标准方法,是的。


32
投票

我知道三种交换变量的方法,但a, b = b, a是最简单的。有

异或(对于整数)

x = x ^ y
y = y ^ x
x = x ^ y

或者简洁地说,

x ^= y
y ^= x
x ^= y

临时变量

w = x
x = y
y = w
del w

元组交换

x, y = y, x

16
投票

我不会说它是一种标准的交换方式,因为它会导致一些意外错误。

nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]

nums[i]将首先被修改,然后影响第二个变量nums[nums[i] - 1]


4
投票

对多维数组不起作用,因为这里使用了引用。

import numpy as np

# swaps
data = np.random.random(2)
print(data)
data[0], data[1] = data[1], data[0]
print(data)

# does not swap
data = np.random.random((2, 2))
print(data)
data[0], data[1] = data[1], data[0]
print(data)

另见Swap slices of Numpy arrays


0
投票

为了解决eyquem解释的问题,你可以使用copy模块通过函数返回包含(反向)值的副本的元组:

from copy import copy

def swapper(x, y):
  return (copy(y), copy(x))

lambda功能相同:

swapper = lambda x, y: (copy(y), copy(x))

然后,将它们分配给所需的名称,如下所示:

x, y = swapper(y, x)

注意:如果你想,你可以导入/使用deepcopy而不是copy

© www.soinside.com 2019 - 2024. All rights reserved.