2013-10-29 13 views
11

Có bất kỳ nhược điểm nào khi sử dụng một bộ trống làm mặc định cho đối số lặp lại cho hàm không? Giả sử rằng những gì bạn muốn trong hàm là một biến đổi không thể thay đổi được. ví dụ:Sử dụng tuple trống làm đối số có thể lặp lại mặc định trong hàm

def foo(a, b=()): 
    print a 
    for x in b: 
    print x 

Tôi dường như không tìm thấy nhiều ví dụ về trường hợp sử dụng này.

+0

Có chức năng làm bất cứ điều gì bên ngoài của 'loop for' ? – DSM

+0

Không, tôi giả định rằng những gì bạn muốn trong hàm là một biến đổi không thể thay đổi. – Ben

+1

Tôi có thiếu gì đó không? Cách duy nhất mà đối số mặc định sẽ được sử dụng là nếu bạn gọi thủ công 'foo' mà không có đối số, như' foo() '. Nhưng nếu bạn biết chức năng chỉ làm bất cứ điều gì nếu iterable là nonempty, tại sao bạn đã bao giờ viết rằng? – DSM

Trả lời

9

Tôi không thể nghĩ ra bất kỳ nhược điểm nào, khi bạn cần một lần lặp không thay đổi được. Tôi nghĩ nó không được sử dụng bởi vì mẫu default_list=Nonedefault_list = default_list or None là những gì được sử dụng cho các vòng lặp có thể thay đổi được và mọi người không bận tâm thay đổi nó (vì không có nhu cầu thực) trong các trường hợp ít xảy ra khi lặp lại là không thay đổi . Chắc chắn không có hành vi bất ngờ như đối số mặc định có thể thay đổi được.

1

Không có vấn đề nội tại khi thiết kế mặc định của bạn thành một bộ trống rỗng không thay đổi. Tuy nhiên, nó có thể được coi là một phương pháp tiếp cận thiết kế không trực quan. Bất kỳ tham chiếu nào đến các vị trí cụ thể trong bộ túp sẽ gây ra một ngoại lệ được nêu ra. Nếu bạn cẩn thận với việc tạo kiểm tra đối số thì đây không phải là vấn đề, nhưng nếu bạn xây dựng phần còn lại của mã để mong đợi dữ liệu từ các vị trí cụ thể và không xác minh tuple trống thì điều này sẽ gây ra lỗi.

Điều đó tùy thuộc vào mục tiêu của bạn cho đối số. Một danh sách trống sẽ có các ứng dụng rõ ràng hơn cho một đối số mặc định (ít nhất là các đối tượng sửa đổi danh sách theo cách nào đó), nhưng một bộ trống không thay đổi sẽ không có bất kỳ sử dụng trực quan nào làm mặc định ngoài việc cho biết không có đối số nào được đưa ra.

Phương pháp điển hình cho các đối số mặc định sẽ được đặt chúng vào Không mà làm cho nó hoàn toàn rõ ràng khi các đối số chưa được thiết lập:

def foo(a, b=None): 
Các vấn đề liên quan