【问题标题】:Global variable re-changes in recursive function / python [duplicate]递归函数/ python中的全局变量重新更改[重复]
【发布时间】: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


【解决方案1】:

我想弹出 middle_array 中的值,但保留 last_array 中的值

每当您附加 middle_array(我可以看到的两个地方)时附加一个副本:

        last_array.append(middle_array.copy())

【讨论】:

  • 它解决了这个问题,非常感谢。我注意到并记住了 value 和 reference 之间的区别,我想它是相关的。我没想到的快速答案和cmets。再次感谢。
猜你喜欢
  • 2014-09-06
  • 2015-04-23
  • 1970-01-01
  • 2014-11-23
  • 2012-11-06
  • 2021-04-09
  • 2020-06-28
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多