Подтвердить что ты не робот

Как сделать мелкую копию списка в Python

Я пытаюсь реализовать алгоритм в Python для создания всех перестановок списка. Но в моем цикле for я хочу сохранить исходный префикс и списки останков неповрежденными, и поэтому я пытаюсь сделать копию этих списков с помощью newprefix и newrest, однако при печати переменной на каждой итерации я вижу, что даже переменный отдых меняется! Как сделать мелкую копию списка в Python? Или есть еще одна проблема с моей попыткой логики?

def perm(prefix, rest):
    if len(rest) == 0:
        print prefix 
    for i in range(len(rest)):
        #prints in the for loop are just for debugging
        print "rest:", rest
        print "i=", i
        newprefix = prefix
        newprefix.append(rest[i])
        newrest = rest
        newrest.pop(i)
        print "old pre : ", prefix
        print "newpre=", newprefix
        print "newrest=", newrest
        perm(newprefix, newrest)


perm([], ['a','b','c'])
4b9b3361

Ответ 1

Чтобы сделать мелкую копию, вы можете нарезать список:

newprefix = prefix[:]

Или передайте его в конструктор list:

newprefix = list(prefix)

Кроме того, я думаю, вы можете немного упростить свой код:

def perm(prefix, rest):
    print prefix, rest

    for i in range(len(rest)):
        perm(prefix + [rest[i]], rest[:i] + rest[i + 1:])

perm([], ['a','b','c'])

Ответ 2

import copy

a = [somestuff]
b = copy.copy(a) # Shallow copy here.
c = copy.deepcopy(a) # Deep copy here.

Копировать модуль стоит знать. http://docs.python.org/2/library/copy.html