【问题标题】:Python Array Unexpected OverwritePython 数组意外覆盖
【发布时间】:2022-01-06 03:32:50
【问题描述】:

我有一个关于 python 列表的问题,当我尝试将列表添加到列表时,我想生成一个类似 (001, 002, 011, 012) 的数组,新列表尝试覆盖旧元素

n = 3
def setNextCombination(P):
    idx = len(P) - 1
    while True:       
        if idx == 0:
            break
        if P[idx] < idx:
            P[idx] += 1
            curr = idx + 1
            while curr < len(P):
                P[curr] = P[idx]
                curr += 1
            return P, True
        idx -= 1
    return [], False

def path_choosing():
    P = np.zeros(n, dtype=int)
    flag = True
    arr = [0,0,0,0]
    idx = 0
    while True:
        P, flag = setNextCombination(P)
        if(flag == False): break
        arr[idx] = P
        idx += 1
        print(idx)
        print(arr)
path_choosing()

实际输出:

1
[array([0, 0, 1]), 0, 0, 0]
2
[array([0, 0, 2]), array([0, 0, 2]), 0, 0]
3
[array([0, 1, 1]), array([0, 1, 1]), array([0, 1, 1]), 0]
4
[array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2])]

我的异常输出

1
[array([0, 0, 1]), 0, 0, 0]
2
[array([0, 0, 1]), array([0, 0, 2]), 0, 0]
3
[array([0, 0, 1]), array([0, 0, 2]), array([0, 1, 1]), 0]
4
[array([0, 0, 1]), array([0, 0, 2]), array([0, 1, 1]), array([0, 1, 2])]

我不知道怎么做,请帮帮我

【问题讨论】:

  • 我将编辑我的标签
  • 数组和列表是不同的东西。此外,您似乎期待按值传递语义,其中将对象传递给函数会生成该对象的副本。这不是 Python 的工作方式。快速了解如何在 Python 中传递对象:nedbatchelder.com/text/names.html

标签: python python-3.x list arraylist


【解决方案1】:
P = np.zeros(n, dtype=int)

这是您在内存中创建 numpy 数组的地方。您将对该数组“P”的引用传递给 setNextCombination 方法,并对其进行更改。您实际上从未在内存中创建一个新数组,因此当您执行 arr[idx] = P 时,您每次都指向内存中的同一个数组。

您应该将 np 数组的副本传递给 setNextCombination。您可以为此使用numpy.copy。或者,在 python 中查找copy 模块。

【讨论】:

  • 这不是一个列表。
  • @user2357112supportsMonica 已编辑
  • @user2357112supportsMonica 谢谢,它有效,但我想要另一个不使用复制模块的解决方案
  • @ttdat-thecodeguy 你也可以使用 numpy.copy:numpy.org/doc/stable/reference/generated/numpy.copy.html。更新了我的答案
  • @entropy 感谢您的帮助
猜你喜欢
  • 2020-08-19
  • 2019-11-26
  • 1970-01-01
  • 2010-09-23
  • 2016-09-16
  • 2015-12-24
  • 2021-08-01
  • 1970-01-01
  • 2016-11-23
相关资源
最近更新 更多