2015-10-26 16 views
5

Lưu ý: Đây là không trùng lặp của linked answer, tập trung vào các vấn đề liên quan đến hiệu suất và điều gì xảy ra phía sau màn cửa khi thực hiện cuộc gọi hàm dict(). Câu hỏi của tôi là về các đối số từ khóa luôn dẫn đến các khóa thuộc loại string. Chắc chắn không phải là một bản sao.Sẽ dict (** kwargs) luôn luôn cung cấp cho từ điển nơi Keys là loại chuỗi?


Phương pháp 1:

suit_values = {'spades':3, 'hearts':2, 'diamonds':1, 'clubs':0} 

Phương pháp 2:

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) 

Method-1 có ý nghĩa đối với tôi. Nó giống như nói với python để cung cấp cho tôi một từ điển nơi các khóa là các chuỗigiá trị là số. Nhưng trong Phương pháp 2, làm thế nào để python biết rằng các khóa là chuỗi và không phải cái gì khác?

Đây có phải là xu hướng không? nếu có, một số ví dụ khác (ngoài các từ điển) cho thấy hành vi kinda này?

EDIT-1:

hiểu biết của tôi từ các câu trả lời là:

  1. Method-2 là cách dict(**kwargs) của việc tạo ra một từ điển.
  2. Trong spades=3, spades là một số nhận dạng Python hợp lệ, do đó, nó được lấy làm khóa của loại string.

Vì vậy, sẽ dict(**kwargs)luôn kết quả trong một cuốn từ điển mà các phím là loại string?

EDIT-2: ^^ CÓ.

Trả lời

4

Trong trường hợp thứ hai, hàm dict chấp nhận đối số từ khóa. Và các đối số từ khóa chỉ có thể được chuyển thành các tham số chuỗi.

Trích dẫn các documentation,

Cung cấp luận cứ từ khóa như trong ví dụ đầu tiên chỉ hoạt động cho các phím được định danh Python hợp lệ. Nếu không, bất kỳ khóa hợp lệ nào cũng có thể được sử dụng.

Miễn là chuỗi là số nhận dạng trăn hợp lệ, bạn có thể sử dụng đó làm khóa trong biểu mẫu thứ hai.Ví dụ, sau đây sẽ không làm việc với hình thức thứ hai

>>> dict(1=2) 
    File "<input>", line 1 
SyntaxError: keyword can't be an expression 

Nhưng cùng sẽ làm việc với các hình thức đầu tiên

>>> {1:2} 
{1: 2} 
+0

tôi đã không thực sự nhận được "Và các đối số từ khóa chỉ có thể được chuyển với chuỗi như tham số" một phần. – Somjit

+0

@Somjit Hmmm, tôi đã chỉnh sửa một chút. Hy vọng nó là rõ ràng bây giờ. – thefourtheye

+0

Ok. Điều đó có ý nghĩa. Vì vậy, các đối số từ khóa có thể được chuyển thành chuỗi chỉ. Nhưng sau khi thay thế được thông qua, chúng cũng được 'hấp thụ' như chuỗi, tức là, được lưu trữ như là các đối tượng kiểu chuỗi? Chỉnh sửa của tôi hỏi câu hỏi đó ở cuối. – Somjit

2

Phương pháp 1, một biểu hiện điển đen, có thể sử dụng như phím bất kỳ giá trị hashable , như chuỗi, số nguyên hoặc tuple s.

Phương pháp 2 - chức năng được tích hợp sẵn dict() - không "biết" rằng các khóa là chuỗi. Bất kỳ phím nào bạn sử dụng với phương thức đó đều phải tuân thủ các quy ước đặt tên biến truyền thống, được chuyển thành chuỗi. Điều đó có nghĩa là mỗi khóa phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới, chỉ chứa các chữ cái, dấu gạch dưới hoặc số, v.v. Thử một khóa khác, như 2a hoặc (1,2), sẽ không thành công.

+0

bạn có thể vui lòng mở lại bài đăng không. Nó không giống như câu hỏi bạn đã đánh dấu là trùng lặp. – Somjit

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