Sự khác biệt là cách đối số được chuyển vào các hàm được gọi. Khi bạn sử dụng *
, các đối số được giải nén (nếu chúng là một danh sách hoặc bộ dữ liệu) — nếu không, chúng chỉ đơn giản là được truyền vào.
Dưới đây là một ví dụ về sự khác biệt:
>>> def add(a, b):
... print a + b
...
>>> add(*[2,3])
5
>>> add([2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (1 given)
>>> add(4, 5)
9
Khi tôi tiền tố lập luận với *
, nó thực sự không đồ đựng danh sách vào hai tham số riêng biệt, được thông qua vào add
như a
và b
. Nếu không có nó, nó chỉ đơn giản là thông qua trong danh sách như là một đối số duy nhất.
Trường hợp tương tự đối với từ điển và **
, ngoại trừ chúng được chuyển vào dưới dạng đối số được đặt tên thay vì đối số được đặt hàng.
>>> def show_two_stars(first, second='second', third='third'):
... print "first: " + str(first)
... print "second: " + str(second)
... print "third: " + str(third)
>>> show_two_stars('a', 'b', 'c')
first: a
second: b
third: c
>>> show_two_stars(**{'second': 'hey', 'first': 'you'})
first: you
second: hey
third: third
>>> show_two_stars({'second': 'hey', 'first': 'you'})
first: {'second': 'hey', 'first': 'you'}
second: second
third: third
dấu mất biến ra khỏi khung :) – LittleQ
thể trùng lặp của [ Hiểu các kwarg trong Python] (http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python) –