- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我想尝试 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]
a[a[0]]
从列表的 a[0]
元素(等于 2
)获取值 a
(值 0
)。a[0]
是 2
因此创建的元组是 (0,2)
(0,2)
被解包并且 0
替换列表中的 2
(第 0 个元素)。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/
我是一名优秀的程序员,十分优秀!