2012-12-31 45 views
6

Trong Python 2.7.1, tôi đang cố cung cấp danh sách thư làm đối số đầu tiên và danh sách màu làm đối số thứ hai. Tôi muốn đối số thứ hai mặc định là danh sách trắng nếu nó không được cung cấp. Đây là cách tôi đã cố gắng thực hiện:Đọc danh sách trong đối số hàm

def multicolor_message(msgs, colors=[libtcod.white for x in len(msgs)]): 
#function body 

libtcod.white là một phần của thư viện tôi đang sử dụng và không gây bất kỳ vấn đề nào. Trình biên dịch cho biết biến số msgs không được xác định. Rõ ràng biến số msgs không tồn tại trong phạm vi này, nhưng tôi cần tạo danh sách độ dài thích hợp và gán nó cho colors. Cách sạch nhất để làm điều này là gì?

+0

bạn nên cung cấp thông điệp stacktrace/lỗi –

+1

Khởi tạo giá trị không xác định trong cơ thể của hàm thay vào đó, hoặc gọi nó thông qua một hàm bao hàm thực hiện điều này cho bạn. – tripleee

+0

@InbarRose Trong trường hợp này stacktrace là không cần thiết để xem những gì sai – piokuc

Trả lời

6

tôi sẽ làm điều đó như thế này:

def multicolor_message(msgs, colors=None): 
    if colors is None: 
    colors=[libtcod.white for x in len(msgs)] 
+4

Và lý do để làm điều đó như thế này là bạn không thể tham chiếu các đối số khác của cùng một hàm trong các giá trị mặc định. Các giá trị mặc định được đánh giá trong phạm vi xác định của hàm và các đối số của chúng chỉ tồn tại khi hàm được gọi. –

+0

@MattiVirkkunen Đúng vậy. – piokuc

+2

Một lý do quan trọng khác là [đối số mặc định có thể thay đổi] (http://stackoverflow.com/q/1132941/395760) hiếm khi làm những gì bạn muốn. – delnan

4

Đó không thể là trăn, như các đối số mặc định chức năng của được thực hiện vào thời điểm định nghĩa hàm và biến msgs của bạn sẽ không có sẵn cho đến khi hàm được gọi.

Từ docs: giá trị tham số

mặc định được đánh giá khi định nghĩa hàm là thực thi. Điều này có nghĩa là biểu thức được đánh giá một lần, khi hàm được xác định và giá trị “được tính trước” giống nhau được sử dụng cho mỗi cuộc gọi. Điều này đặc biệt quan trọng để hiểu khi tham số mặc định là đối tượng có thể thay đổi, chẳng hạn như danh sách hoặc từ điển: nếu chức năng sửa đổi đối tượng (ví dụ: bằng cách thêm mục vào danh sách ), giá trị mặc định có hiệu lực được sửa đổi . Điều này thường không phải là những gì đã được dự định. Một khoảng cách này là sử dụng Không như là mặc định, và kiểm tra một cách rõ ràng cho nó trong cơ thể của các chức năng, ví dụ:

def whats_on_the_telly(penguin=None): 
    if penguin is None: 
     penguin = [] 
    penguin.append("property of the zoo") 
    return penguin 
+0

Không phải lúc biên dịch. Tại thời điểm định nghĩa hàm. Sự khác biệt quan trọng đối với các hàm lồng nhau hoặc khi các tên cấp mô-đun được sử dụng trong các biểu thức. – delnan

Các vấn đề liên quan