Python数组元素交换:两种方法失败原因解析(疑涉内存引用)
Python数组元素交换失败原因解析
给定数组A = [11, 0, 9, 2, 7],目标是交换A[0]与A[3],预期结果为A = [2, 0, 9, 11, 7]。以下四种交换方法中前两种执行失败,后两种成功,下面解释前两种方法失败的核心原因:
方法一(失败)
A = [11, 0, 9, 2, 7] print("原始数组:", A) temp = A[0] temp, A[3] = A[3], temp print("方法一结果:", A)
方法二(失败)
A = [11, 0, 9, 2, 7] temp = A[0] A[3], temp = temp, A[3] print("方法二结果:", A)
方法三(成功)
A = [11, 0, 9, 2, 7] A[0], A[3] = A[3], A[0] print("方法三结果:", A)
方法四(成功)
A = [11, 0, 9, 2, 7] temp = A[0] # temp = 11 A[0] = A[3] A[3] = temp print("方法四结果:", A)
实际执行结果
- 原始数组:
[11, 0, 9, 2, 7] - 方法一(失败):
[11, 0, 9, 11, 7] - 方法二(失败):
[11, 0, 9, 11, 7] - 方法三(成功):
[2, 0, 9, 11, 7] - 方法四(成功):
[2, 0, 9, 11, 7]
失败原因分析
前两种方法的核心问题在于根本没修改到A[0]的值:
- 方法一中,
temp, A[3] = A[3], temp仅更新了temp和A[3]:temp被设为A[3]的原始值(2),A[3]被设为temp的原始值(11),但全程未对A[0]做任何赋值操作,所以A[0]仍为初始值11,无法完成交换。 - 方法二逻辑和方法一完全一致,
A[3], temp = temp, A[3]同样只操作了A[3]和temp,未触碰A[0],结果自然不符合预期。
成功的两种方法逻辑清晰:
- 方法三利用Python元组解包特性,先将右侧
A[3]和A[0]的原始值(2、11)打包为元组,再依次赋值给左侧的A[0]和A[3],相当于暂存了两个目标值,同时完成两个元素的修改。 - 方法四是经典临时变量交换法:先用
temp保存A[0]的原始值,再将A[0]替换为A[3]的值,最后把temp的值赋给A[3],完整覆盖了交换的全部步骤。
内容的提问来源于stack exchange,提问作者Shck Tchamna
相关产品推荐
相关产品推荐

