【发布时间】:2020-10-02 19:57:56
【问题描述】:
我正在尝试在 Python 中使用递归函数。即使我可以使用修饰符更改全局值的值,它也会在此修饰符更改时重新更改。
这里是代码方案;
array = [1,2,3]
middle_array = []
last_array = []
def recursive_array(in_array):
global last_array
global middle_array
for rank in range(0, len(in_array)):
if len(in_array) == 0:
last_array.append(middle_array)
return last_array
elif len(in_array) == 1:
middle_array.append(in_array[0])
last_array.append(middle_array)
return last_array
middle_array.append(in_array[rank])
bottom = rank -1
top = rank +2
if bottom <= 0:
bottom = 0
if top >= len(in_array):
top = len(in_array)
changable_array = in_array[top:]
recursive_array(changable_array)
last_array.append(middle_array)
middle_array.pop()
return last_array
第一个“recursive_array”循环从 [1,2,3] “in_array”开始。 "middle_array" 采用正确的 append() 命令,程序执行正确的 "changeable_array" 作为 [3]。
第一次递归调用带有“in_array”作为[3],所以转到“elif len(in_array) == 1:”命令。更新已正确完成。现在,middle_array 是 [1,3] 和 last_array 是 [1,3] 然后返回添加最后一个追加到 last_array 作为 [[1,3],[1,3]]。
elif len(in_array) == 1:
middle_array.append(in_array[0])
last_array.append(middle_array)
在此之后,命令“middle_array.pop()”命令正在删除数组的最后一个元素。但是,这是我的问题;当 middle_array 弹出时,“last_array”值也会弹出。
recursive_array(changable_array)
last_array.append(middle_array)
middle_array.pop()
流行前;
last_array = [[1,3],[1,3]] middle_array = [1,3]
弹出后;
last_array = [[1],[1]] middle_array = [1]
我想弹出 middle_array 中的值,但保留 last_array 中的值。你能给我指路吗? 感谢您抽出时间和您的兴趣。
【问题讨论】:
-
对同一个列表对象有多个引用,改变一个改变所有。你看。 G。
middle_array[:]创建列表的(浅)副本,您可以将其附加到last_array。 -
last_array包含对middle_array的两个引用。当您打印last_array时,将遵循这些引用,因此包括对middle_array所做的任何更改。您可能会考虑在middle_array上调用copy(),这样last_array就不会直接包含对它的引用,而是对包含数据副本的不同数据结构的引用。 -
This example 因为这种引用混淆有点简单,可能有助于您理解问题。
-
在
middle_array.pop()之后添加print([thing is middle_array for thing in last_array])可以看到last_array 中的所有项都是一样的。 ...Facts and myths about Python names and values -
Copy() 方法解决了,和我想的其他方法一样,非常感谢。我想这个问题与价值和参考存储之间的差异有关。我没想到的快速答案和cmets。再次感谢。
标签: python arrays recursion global