2008-10-22 9 views
12

Vì vậy, tôi tự dạy Python và tôi đang gặp sự cố với danh sách. Tôi muốn vượt qua chức năng của tôi một danh sách và các mục pop tắt nó trong khi giữ lại danh sách ban đầu. Làm thế nào để làm cho python "dụ" danh sách thông qua thay vì đi qua một con trỏ đến bản gốc?Truyền danh sách trong khi vẫn giữ nguyên bản gốc

Ví dụ:

def burninate(b): 
    c = [] 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

a = range(6) 
d = burninate(a) 
print a, d 

Output: [0, 1, 2] [5, 4, 3]
đầu ra mong muốn: [0, 1, 2, 3, 4, 5] [5, 4, 3]

Cảm ơn!

+0

http: // stackoverflow.com/questions/184643/what-is-the-best-way-to-copy-a-danh sách-trong-python –

+0

Trogdor, ghi dữ liệu của bạn !!! –

Trả lời

14

Như các câu trả lời khác đã đề xuất, bạn có thể cung cấp chức năng của mình với bản sao danh sách.

Là một thay thế, chức năng của bạn có thể mất một bản sao của đối số:

def burninate(b): 
    c = [] 
    b = list(b) 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

Về cơ bản, bạn cần phải rõ ràng trong tâm trí của bạn (và trong tài liệu của bạn) dù chức năng của bạn sẽ thay đổi đối số của nó. Theo ý kiến ​​của tôi, các hàm trả về các giá trị được tính sẽ không thay đổi đối số của chúng và các hàm thay đổi các đối số của chúng không được trả về bất kỳ thứ gì. Xem python's [] .sort(), [] .extend(), {} .update(), v.v. cho ví dụ. Rõ ràng có những ngoại lệ (như .pop()).

Ngoài ra, tùy thuộc vào trường hợp cụ thể của bạn, bạn có thể viết lại hàm để tránh sử dụng pop() hoặc các hàm khác sửa đổi đối số. ví dụ.

def burninante(b): 
    return b[:-4:-1] # return the last three elements in reverse order 
+0

Tôi thích slice ngược của bạn +1 – mhawke

+0

+1 cho phiên bản ngắn nhất từ ​​trước đến nay –

10

Bạn có thể gọi burninate() với một bản sao của danh sách như thế này:

d = burninate(a[:])

hay,

d = burninate(list(a))

Các thay thế khác là để tạo một bản sao của danh sách trong của bạn phương pháp:

def burninate(b): 
    c=[] 
    b=b[:] 
    for i in range(3): 
     c.append(b.pop()) 
    return c 

>>> a = range(6) 
>>> b = burninate(a) 
>>> print a, b 
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3] 
6

Một cách nhẹ dễ đọc hơn để làm điều tương tự là:

d = burninate(list(a)) 

Ở đây, các nhà xây dựng list() tạo ra một danh sách mới dựa trên a.

2

các phiên bản khác:

def burninate(b): 
    c = [] 
    for i in range(1, 4): 
     c.append(b[-i]) 
    return c 
def burninate(b): 
    c = b[-4:-1] 
    c.reverse() 
    return c 

Và một ngày nào đó bạn sẽ yêu thích comprehensions danh sách:

def burninate(b): 
    return [b[-i] for i in range(1,4)] 
5

Một giải pháp tổng quát hơn sẽ được import copy, và sử dụng copy.copy() trên tham số.

+0

Nếu bạn đang mong đợi một cái gì đó giống như danh sách, sau đó nó sẽ không gây ra bất kỳ vấn đề chỉ cần sử dụng danh sách(). –

0
burninate = lambda x: x[:-4:-1]
1

Bạn có thể sử dụng copy.deepcopy()