Список изменяется, но я не изменял его напрямую - PullRequest
0 голосов
/ 06 августа 2020

В моем коде я пытаюсь получить каждую комбинацию элементов в списке (я не хотел использовать itertools). Я делаю это путем подсчета в двоичном формате с помощью True и False, а затем применяю это в исходном списке, чтобы получить все комбинации (если это правда, число останется в списке, но не будет удалено). Теперь я присвоил x 0, поэтому [False, False, ...], а в l oop добавляются двоичные числа. Теперь проблема в том, что если я хочу сбросить список до 0, он не изменится и просто продолжу использовать предыдущий список. например, в первом коде, где print(x) печатается: [False,False,False,False,False,False,False,False,],[True,False,False,False,False,False,False,False,],[True,True,False,False,False,False,False,False,], ...]. Я могу напечатать x или test, и он напечатает тот же результат, но я не изменил x. Есть идеи?

def get_combinations(arr):
    true = []
    x = []

    for thing in range(0,len(arr)):
        true.append(thing)
        x.append(False)

    true.sort(reverse=True)
    test = []
    final = []
    länge = 2**len(arr)
    for number in range(länge):

        test = x   <------------------------------- here
        #print(x) or print(test)
        for thing in true:

            if number / (2**thing) >= 1:
                test[thing] = True
                number -= 2**thing  
  
        final.append(test)

    return final


test = [1,2,4,5,3,1,5,13]
get_combinations(test)

Если я изменю строку на:

test = [False,False,False,False,False,False,False,False]

, она будет работать нормально.

1 Ответ

0 голосов
/ 06 августа 2020

Искать "Глубокая копия против / с Мелкая копия в Python"

Вкратце:

x= [1,2,3] 

Если:

y = x       # x: [1,2,3]  , y: [1,2,3]
y[0] = 4    # x: [4,2,3]  , y: [4,2,3]

- обратите внимание, что на y = x оба 'y' и 'x' установлены равными, но, что более важно, 'x' и 'y' являются одним и тем же объектом ... любое изменение в одном изменит другой. Следовательно, y[0] = 4 также влияет на xie x[0] is also now 4.

С другой стороны:

y = x.copy()  # x: [1,2,3]  , y: [1,2,3]
y[0] = 4      # x: [1,2,3]  , y: [4,2,3]

- здесь 'y' имеет то же значение, что и 'x', но это разные объекты . изменение y через y[0] = 4 не влияет на 'x'.

В вашем коде:

test =x

и более поздние элементы 'test' изменяются, изменяя 'x', затем в следующем итерация for loop, 'x' больше не [False, False ...]

Замените эту строку на:

test =x.copy() 
...