Câu hỏi này sẽ khá dài, vì vậy tôi xin lỗi trước.đối số vị trí dư thừa, giải nén danh sách đối số hoặc tuples và mở rộng lặp lại giải nén
Trong Python chúng ta có thể sử dụng * trong ba trường hợp sau:
I. Khi xác định một chức năng mà chúng ta muốn trở thành callable với một số tùy ý của các đối số, chẳng hạn như in this example:
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
Trong trường hợp này, các đối số vị trí dư thừa được thu thập thành tuple.
II. Trường hợp ngược lại là khi các đối số đã có trong cả hai danh sách hoặc một tuple và chúng tôi muốn giải nén chúng cho một cuộc gọi chức năng yêu cầu đối số vị trí riêng biệt, chẳng hạn như in this example:
>>> range(3, 6) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # call with arguments unpacked from a list
[3, 4, 5]
III. Bắt đầu với Python 3, * cũng được sử dụng trong bối cảnh mở rộng danh sách hoặc tuple giải nén, chẳng hạn như in this example cho các bộ:
>>> a, *b, c = range(5)
>>> b
[1, 2, 3]
hoặc cho các danh sách:
>>> [a, *b, c] = range(5)
>>> b
[1, 2, 3]
Trong cả hai trường hợp, tất cả các mục từ lặp lại được giải nén không được gán cho bất kỳ biểu thức bắt buộc nào được gán cho một danh sách .
Vì vậy, đây là câu hỏi: trong trường hợp tôi args thêm được thu thập vào một tuple, trong khi trong trường hợp III các mục thêm được gán cho một danh sách . Rằng sự khác biệt này? Lời giải thích duy nhất tôi có thể tìm được trong PEP 3132 mà nói rằng:
thay đổi có thể xảy ra thảo luận là:
[...]
Làm cho mục tiêu được đánh dấu sao một tuple thay vì một danh sách . Điều này sẽ là phù hợp với chức năng * args, nhưng xử lý thêm kết quả khó hơn.
Tuy nhiên, từ góc độ sư phạm sự thiếu nhất quán là có vấn đề, đặc biệt là cho rằng nếu bạn muốn để xử lý kết quả, bạn luôn có thể nói danh sách (b) (giả sử b trong ví dụ trên là một tuple). Tui bỏ lỡ điều gì vậy?
Cảm ơn câu trả lời. Tóm lại những gì tôi nghe là trường hợp đó ** I ** nên được thiết kế để đưa ra một danh sách. –
@ Alexandros, đó thực sự là ý kiến của tôi - nhưng tất nhiên là trở ngại là 20/20, và quyết định đó đã được đưa ra ... Tôi không chắc chắn khi nào, nhưng nó đã có trong Python 1.5.2, cách đây hơn 11 năm. –