Python数组旋转代码运行异常 迭代后元素全为7的问题排查
数组旋转代码运行异常问题定位
问题复现
使用测试输入3 6 8 7运行原代码,预期三次右旋转输出为7 3 6 8、8 7 3 6、6 8 7 3,实际仅第一次输出符合预期,后续输出均为全7列表。
原代码如下:
def solution(A): A_inp = A roated_a =list(range(len(A_inp))) k=1 while k < 3: for i in range(len(A_inp)-1): roated_a[i+1] = A_inp[i] roated_a[0] = A_inp[len(A_inp)-1] A_inp = roated_a k+=1 print(roated_a) inp_arr = [int(item) for item in input("Enter the list items : ").split()] solution(inp_arr)
错误根因
代码共有3处核心问题,共同导致了全7的异常输出:
- 列表引用赋值导致数据源污染:Python中列表是可变对象,直接使用
=赋值不会生成新列表,仅会给同一块内存地址的列表新增一个引用变量。第一次循环结束后执行A_inp = roated_a,两个变量指向完全相同的列表对象。第二轮循环遍历过程中修改roated_a元素时,会同步改动A_inp存储的源数据,遍历到后续索引时读取到的已经是被篡改后的值,而非原始旋转前的数组元素。 - 结果列表未按轮次重置:
roated_a仅在函数入口初始化一次,第二轮、第三轮旋转时直接复用已经存了上一轮结果的列表,旧值残留会干扰新结果生成。 - 0号位赋值位置错误:每轮右旋转仅需要给结果列表的0号位赋值1次(即旋转前数组的最后一个元素),原代码将这行逻辑写在for循环内部,每遍历一个元素就重复覆盖0号位。第二轮循环最后一步遍历到末尾时,数组末尾元素已经被篡改成为7,0号位也会被覆盖为7,最终得到全7列表。
修复后代码
针对以上问题调整后,代码可正常输出预期结果:
def solution(A): current_arr = A.copy() k = 1 # 共需要输出3次旋转结果,循环执行3轮 while k <= 3: arr_len = len(current_arr) # 每轮旋转新建独立的结果列表,避免旧值残留和引用干扰 rotated_a = [0] * arr_len # 0号位赋值仅需每轮执行1次,移到循环外 rotated_a[0] = current_arr[-1] for i in range(arr_len - 1): rotated_a[i+1] = current_arr[i] # 拷贝当前轮结果作为下一轮的输入数组,避免引用关联 current_arr = rotated_a.copy() print(rotated_a) k += 1 inp_arr = [int(item) for item in input("Enter the list items : ").split()] solution(inp_arr)
运行测试输入3 6 8 7,输出如下,完全符合预期:
[7, 3, 6, 8] [8, 7, 3, 6] [6, 8, 7, 3]
内容的提问来源于stack exchange,提问作者DEBASHIS BAIDYA
相关产品推荐
相关产品推荐

