python a,b = b,a 实现?它与 C++ 交换函数有何不同?

标签 python algorithm

当我想尝试 python 版本时遇到了这个问题: https://leetcode.com/problems/first-missing-positive/discuss/17071/My-short-c++-solution-O(1)-space-and-O(n)-time

我不确定为什么 a[0], a[a[0]] = a[a[0]], a[0] 这个不做交换?

>>> nums
[2, 1, 0]
>>> a = [2,1,0]
>>> a[0], a[a[0]] = a[a[0]], a[0]
>>> a
[2, 1, 0]
>>> a[0]
2
>>> a[0],a[2] = a[2], a[0]
>>> a
[0, 1, 2]

我的猜测是 a, b = b, a 语法的实现是这样的:

tmp = a[0] (tmp = 2)
a[0]  = a[a[0]] (a[0] = a[2] = 0)
a[a[0]] = tmp (a[a[0]] = a[0] = tmp = 2)

然后我查看了C++中swap函数的实现。我对C++一无所知,但看起来这个想法是一样的 : http://www.cplusplus.com/reference/algorithm/swap/

The behavior of these function templates is equivalent to:
template <class T> void swap (T& a, T& b)
{
  T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template <class T, size_t N> void swap (T (&a)[N], T (&b)[N])
{
  for (size_t i = 0; i<N; ++i) swap (a[i],b[i]);
}

我们有 c = a,然后 a = b 和 b = a 那么为什么C++的swap函数没有这个问题呢? 以及如何用 pythonic 方式编写这种交换函数?

最佳答案

这种行为确实与Python评估类型表达式的方式有关

a,b=b,a

事实上,Python 所做的是首先通过创建元组 (b,a) 来“准备”右侧的值。然后这个元组被解包并以相反的顺序分配给变量。

重要的是要注意,尽管 Python 使用引用 来对象 objects the variable names refer to may change if they refer to values of immutable type . 可变 类型并非如此(如图 by example in Python FAQ 所示)。

使用您使用的可变类型(列表)分解示例:

a = [2,1,0]    
a[0], a[a[0]] = a[a[0]], a[0]
  1. a[a[0]] 从列表的 a[0] 元素(等于 2)获取值 a(值 0)。
  2. a[0]2 因此创建的元组是 (0,2)
  3. 元组 (0,2) 被解包并且 0 替换列表中的 2(第 0 个元素)。
  4. 现在,a[a[0]] 可以理解为:获取列表 a 的第 0 个元素(当前为 0)然后用 2 从元组解包中替换列表中那个位置的值(现在 0 被替换为 2 - 这使得操作看起来就像它对列表没有任何作用一样)。

the answer from von Oak 中的建议更改顺序会有所帮助,因为从上面第 4 点开始的步骤不会再次替换该值。

建议引用passing by assignment回答以了解函数和参数传递。

关于python a,b = b,a 实现?它与 C++ 交换函数有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51950193/

相关文章:

java - java中随机唯一的字母数字字符串

algorithm - 作业调度算法的反例 "Earliest End time First"

python - 来自数组的直方图 matplotlib

python - Django:将 "Signals"与 "dispatch_uid"一起使用时如何防止重复?

python - console_scripts 入口点被忽略?

python - 合并重叠的多边形直到没有重叠

python - 为什么 lxml 不去掉节标签?

algorithm - 如何仅通过长度来判断形状是否为四边形?

c++ - 从字符串中删除重复字符

c - 队列类型数据结构使用数组实现