2010-02-12 36 views
31

Tôi tò mò bởi sự biểu hiện python sau:`**` có nghĩa gì trong biểu thức `dict (d1, ** d2)`?

d3 = dict(d1, **d2) 

Nhiệm vụ là kết hợp 2 từ điển thành một thứ ba, và biểu thức trên hoàn thành nhiệm vụ tốt. Tôi quan tâm đến các nhà điều hành ** và chính xác những gì nó làm cho biểu thức. Tôi nghĩ rằng ** là nhà điều hành điện và chưa thấy nó được sử dụng trong ngữ cảnh ở trên.

Đoạn đầy đủ của mã là thế này:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3 = dict(d1, **d2) 
>>> print d3 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 
+4

Cần lưu ý rằng GvR cho rằng biểu thức này là [đáng khinh] (http://mail.python.org/pipermail/python-dev/2010-April/099459.html) – elhefe

+1

Điều này chỉ hoạt động nếu các phím trong ' d2' là các chuỗi, ít nhất là bằng Python 3. – nobar

+0

Ồ, tuyệt, tôi không nhận ra nó sẽ hoạt động ở tất cả trong Python 2. Tôi cho rằng đó là lợi thế của 'dict (d1, ** d2)' trên 'dict (** d1, ** d2) 'hoặc' {d1, ** d2} 'hoặc' {** d1, ** d2} '—nó hoạt động trong Python 2. Tôi nghĩ rằng cú pháp cuối cùng là cú pháp ưa thích trong Python 3 bởi vì nó ngắn gọn và nhất quán. Nhưng thật tuyệt khi biết có một cách để làm điều đó trong Python 2, ít nhất là với các phím chuỗi, ngay cả khi nó trông hơi khó hiểu. –

Trả lời

30

** trong danh sách đối số có một ý nghĩa đặc biệt, như được đề cập trong section 4.7 of the tutorial. Từ điển (hoặc từ điển giống như) đối tượng được truyền với **kwargs được mở rộng thành các đối số từ khóa cho các cuộc gọi, giống như *args được mở rộng thành các đối số vị trí riêng biệt.

+0

+1: Tham khảo hướng dẫn. –

+0

Câu hỏi của tôi là, tại sao sử dụng 'dict (d1, ** d2)' và không phải 'dict (** d1, ** d2)'. Sau này trông sạch hơn với tôi, và kết quả cuối cùng có vẻ giống nhau. Tui bỏ lỡ điều gì vậy? –

+0

Đừng bận tâm; Tôi đã không nhận ra rằng chúng tôi đang nói về Python 2, nơi 'dict (d1, ** d2)' có vẻ là cách duy nhất. Rất vui khi biết điều đó thậm chí có thể.Tôi nghĩ rằng '{** d1, ** d2}' là cú pháp ưa thích trong Python 3, mặc dù, vì nó nhất quán và súc tích. –

9

Trong Python, bất kỳ chức năng có thể chấp nhận nhiều tranh cãi với *;
hoặc nhiều keyword arguments với **.

Tiếp nhận-side dụ:

>>> def fn(**kwargs): 
... for kwarg in kwargs: 
...  print kwarg 
... 
>>> fn(a=1,b=2,c=3) 
a 
c 
b 

Calling-side dụ (nhờ Thomas):

>>> mydict = dict(a=1,b=2,c=3) 
>>> fn(**mydict) 
a 
c 
b 
+0

Lưu ý rằng điều đó thể hiện mặt nhận, không phải bên gọi. –

+0

Cảm ơn một lần nữa Thomas :-D Thêm ví dụ bên gọi. – bernie

7

Các ** biến từ điển vào các thông số từ khóa:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3 = dict(d1, **d2) 

trở thành:

>>> d3 = dict(d1, c=3, d=4) 
+1

nó trở thành 'dict (d1, c = 3, d = 4)' thay thế. –

+0

Vâng, cảm ơn! Tôi biết những gì tôi có nghĩa là để loại, nhưng ngón tay của tôi đã không nhận được tin nhắn ... –

1

bạn đã có câu trả lời của bạn của toán tử **. đây là một cách khác để thêm từ điển

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'c': 3, 'd': 4} 
>>> d3=d1.copy() 
>>> d3.update(d2) 
>>> d3 
{'a': 1, 'c': 3, 'b': 2, 'd': 4} 
3

Nó cũng đáng nhắc đến cơ chế của hàm tạo dict. Phải mất một từ điển ban đầu làm đối số đầu tiên của nó và cũng có thể lấy đối số từ khóa, mỗi từ đại diện cho một thành viên mới để thêm vào từ điển mới được tạo ra.

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