Как сделать мелкую копию списка в 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'])
Ответы
Ответ 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