2013-04-29 4 views
11

Tôi đang cố triển khai một thuật toán bằng Python để tạo tất cả các danh sách của một danh sách. Nhưng tôi Trong vòng lặp của tôi, tôi muốn giữ lại tiền tố ban đầu và danh sách còn lại nguyên vẹn, và do đó tôi đang cố gắng tạo một bản sao của các danh sách đó bằng newprefix và newrest, tuy nhiên khi in các biến còn lại ở mỗi lần lặp lại, tôi thấy rằng ngay cả phần còn lại biến là nhận được sửa đổi! Làm thế nào tôi có thể tạo một bản sao nông của danh sách bằng Python? Hoặc là có một vấn đề khác với logic cố gắng của tôi?Cách tạo một bản sao nông của một danh sách bằng 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

Trừ khi điều này là để làm giàu cho riêng bạn, bạn có thể nên sử dụng itertools.permutations(). – dstromberg

Trả lời

27

Để tạo một bản sao cạn, bạn có thể cắt danh sách:

newprefix = prefix[:] 

Hoặc vượt qua nó vào list constructor:

newprefix = list(prefix) 

Ngoài ra, tôi nghĩ bạn có thể đơn giản hóa mã của bạn một chút:

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']) 
+0

Cách đầu tiên của bạn (cắt) là cách ưa thích của tôi để hoàn thành việc này. Tôi chỉ nghĩ rằng tôi cũng sẽ cho họ biết về mô-đun sao chép. +1 – BlackVegetable

+0

@Blender Cảm ơn mã đơn giản trông đẹp hơn rất nhiều! – KT100

+2

Chỉ cần tự hỏi - không phải là hoạt động lát không khai báo? Không phải là tốt nhất để khai báo rõ ràng những gì bạn đang làm? 'copy_list = original_list [:]' không khai báo rằng một bản sao đang xảy ra, trong khi 'copy_list = copy.copy (original_list)' là khai báo cao. –