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

Python中是否有交换两个变量的标准化方法?,python,syntax,swap,conventions,Python,Syntax,Swap,Conventions,在Python中,我看到两个变量值使用以下语法交换: left, right = right, left 这被认为是交换两个变量值的标准方式,还是按照惯例,两个变量通常通过其他方式交换?这是交换两个变量的标准方式,是的。这是交换两个变量的标准方式,是的 Python从左到右计算表达式。注意 在评估作业时,右手边在 左手边 这意味着表达式a,b=b,a: 计算右侧b,a,也就是说,在内存中创建两个元素的元组。这两个元素是由标识符b和a指定的对象,它们在程序执行过程中遇到指令之前存在 在创建这

在Python中,我看到两个变量值使用以下语法交换:

left, right = right, left

这被认为是交换两个变量值的标准方式,还是按照惯例,两个变量通常通过其他方式交换?

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

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

Python从左到右计算表达式。注意 在评估作业时,右手边在 左手边

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

  • 计算右侧
    b,a
    ,也就是说,在内存中创建两个元素的元组。这两个元素是由标识符
    b
    a
    指定的对象,它们在程序执行过程中遇到指令之前存在
  • 在创建这个元组之后,还没有对这个元组对象进行赋值,但这并不重要,Python内部知道它在哪里
  • 然后,计算左侧,也就是说,将元组分配给左侧
  • 由于左侧由两个标识符组成,因此对元组进行解包,以便将第一个标识符
    a
    分配给元组的第一个元素(该对象在交换之前是b,因为它有名称
    b

    第二个标识符
    b
    被分配给元组的第二个元素(这是交换之前a的对象,因为它的标识符是
    a
该机制有效地交换了分配给标识符
a
b

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

Python从左到右计算表达式。注意 在评估作业时,右手边在 左手边

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

  • 计算右侧
    b,a
    ,也就是说,在内存中创建两个元素的元组。这两个元素是由标识符
    b
    a
    指定的对象,它们在程序执行过程中遇到指令之前存在
  • 在创建这个元组之后,还没有对这个元组对象进行赋值,但这并不重要,Python内部知道它在哪里
  • 然后,计算左侧,也就是说,将元组分配给左侧
  • 由于左侧由两个标识符组成,因此对元组进行解包,以便将第一个标识符
    a
    分配给元组的第一个元素(该对象在交换之前是b,因为它有名称
    b

    第二个标识符
    b
    被分配给元组的第二个元素(这是交换之前a的对象,因为它的标识符是
    a
该机制有效地交换了分配给标识符
a
b

因此,回答您的问题:是的,这是交换两个对象上的两个标识符的标准方法。

顺便说一下,对象不是变量,它们是对象。

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

XOR(用于整数)
x=x^y
y=y^x
x=x^y
或者简而言之

x ^= y
y ^= x
x ^= y
临时变量
w=x
x=y
y=w
德尔瓦
元组交换
x,y=y,x

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

XOR(用于整数)
x=x^y
y=y^x
x=x^y
或者简而言之

x ^= y
y ^= x
x ^= y
临时变量
w=x
x=y
y=w
德尔瓦
元组交换
x,y=y,x

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

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

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

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

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

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

不适用于多维数组,因为此处使用引用

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)

另请参见

不适用于多维数组,因为此处使用了引用

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)

另请参见

要解决所解释的问题,可以使用
copy
模块通过函数返回包含(反转)值副本的元组:

from copy import copy

def swapper(x, y):
  return (copy(y), copy(x))
与λ
相同的功能

swapper = lambda x, y: (copy(y), copy(x))
然后,将这些名称指定给所需的名称,如下所示:

x, y = swapper(y, x)

注意:如果您愿意,您可以导入/使用
deepcopy
而不是
copy
来解决所解释的问题,您可以使用
copy
模块通过以下函数返回包含(反转)值副本的元组:

from copy import copy

def swapper(x, y):
  return (copy(y), copy(x))
与λ
相同的功能

swapper = lambda x, y: (copy(y), copy(x))
然后,将这些名称指定给所需的名称,如下所示:

x, y = swapper(y, x)

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

您可以组合元组和XOR交换:x,y=x^x^y,x^y^y

x, y = 10, 20

print('Before swapping: x = %s, y = %s '%(x,y))

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

print('After swapping: x = %s, y = %s '%(x,y))

使用lambda:

输出:

Before swapping: x =  10 , y =  20
After swapping: x =  20 , y =  10

您可以组合元组和异或交换:x,y=x^x^y,x^y^y

x, y = 10, 20

print('Before swapping: x = %s, y = %s '%(x,y))

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

print('After swapping: x = %s, y = %s '%(x,y))

使用lambda:

O