Hvordan man laver en overfladisk kopi af en liste i Python

Jeg forsøger at implementere en algoritme i Python til at generere alle Permutationer af en liste. Men jeg I min for-løkken jeg ønsker at bevare den oprindelige præfiks og resten lister intakt, og derfor forsøger jeg at lave en kopi af disse lister ved hjælp af newprefix og newrest, men om udskrivning af variable resten ved hver iteration, kan jeg se, at selv den variabel, resten er at få ændret! Hvordan kan jeg gøre en overfladisk kopi af listen i Python? Eller er der et andet problem med min forsøgt logik?

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'])
Medmindre det er for din egen berigelse, du burde nok bruge itertools.permutationer().

OriginalForfatteren KT100 | 2013-04-29

2 svar

  1. 32

    Til at lave en overfladisk kopi, kan du skive listen:

    newprefix = prefix[:]

    Eller videregive det til den list konstruktør:

    newprefix = list(prefix)

    Også, jeg tror, du kan forenkle din kode lidt:

    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'])
    Din første (udskæring) er min foretrukne måde at opnå dette. Jeg syntes bare jeg ville lade dem vide, om kopi-modul samt. +1
    Takket være den forenklede kode ser så meget bedre!
    Bare undrer dig over, er det ikke den skive drift non-deklarativ? Er det ikke det bedste til klart at erklære, hvad du laver? copied_list = original_list[:] ikke erklære, at en kopi er, der forekommer, henviser til, at copied_list = copy.copy(original_list) er meget deklarativ.

    OriginalForfatteren Blender

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *