多维数组完全(除了第一个值)设置为附加值

时间:2015-12-22 21:26:00

标签: python list multidimensional-array append

我正在创建一个函数来查找给定选项集的所有组合。当我将一个组合作为列表添加到总组合的主列表中时(组合是索引,稍后将从选项列表中获取),所有现有列表将更改为我刚刚附加的列表,除了第一个

def allCombos(opts):
    limit = len(opts) - 1
    combos = []
    for n in range(1, 3):
        combo = [0] * n
        print(combo) # going to remove this
        goal = [limit] * n
        pointer = 0
        overflowed = False
        while True:
            if combo[pointer] == limit:
                pointer += 1
                overflowed = True
            else:
                if overflowed:
                    combo[pointer] += 1
                    for i in range(pointer):
                        combo[i] = 0
                    pointer = 0
                    combos.append(combo)
                    print(combo) # I will change this
                else:
                    combo[pointer] += 1
                    combos.append(combo)
                    print(combo) # and this
            if combo == goal:
                break

allCombos(["foo", "bar"])

输出

[0]
[1]
[0, 0]
[1, 0]
[0, 1]
[1, 1]

,而

def allCombos(opts):
    limit = len(opts) - 1
    combos = []
    for n in range(1, 3):
        combo = [0] * n
        goal = [limit] * n
        pointer = 0
        overflowed = False
        while True:
            if combo[pointer] == limit:
                pointer += 1
                overflowed = True
            else:
                if overflowed:
                    combo[pointer] += 1
                    for i in range(pointer):
                        combo[i] = 0
                    pointer = 0
                    combos.append(combo)
                    print(combos) # changed
                else:
                    combo[pointer] += 1
                    combos.append(combo)
                    print(combos) # changed
            if combo == goal:
                break
    print("\n" + str(combos)) #added

allCombos(["foo", "bar"])

输出

[[1]]
[[1], [1, 0]]
[[1], [0, 1], [0, 1]]
[[1], [1, 1], [1, 1], [1, 1]]

[[1], [1, 1], [1, 1], [1, 1]]

这似乎很奇怪,因为combos的唯一指定修改似乎是附加的。

我已经找到了类似问题的其他问题,但我找不到任何问题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您将combo的多个引用附加到combos。当您更改combo时,这些引用都指向修改后的列表。与这个简单的例子相比:

>>> x=[1,2]
>>> y=[]
>>> y.append(x)
>>> y.append(x)
>>> y
[[1, 2], [1, 2]]
>>> x[0]+=1
>>> y
[[2, 2], [2, 2]]
>>> 

请注意combo最初以[0]开头,但您从未在输出中看到过。那是因为它被改为[1]。当您到达循环的顶部时,将combo设置为[0,0]。为什么这不会影响combos?因为您已将combo设置为新值。 combos中的引用指向与新创建的组合不同的对象。现在,您开始更改combo,并将其附加到列表中。你只需得到同一件事的多份副本。

如果不清楚,请尝试将限制设置为3而不是2.您能预测输出是什么吗?

我认为Gary van der Merwe提出了一个很好的建议,但我相信他在考虑itertools.product,而不是itertools.combinations