You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:01:17