2012-02-15 12 views
34

Tôi đang làm gì sai ở đây?Thêm số để đặt

a = set().add(1) 
print a # Prints `None` 

Tôi đang cố thêm số 1 vào bộ trống.

+2

@CharlesB Nếu bạn đang đưa ra một câu trả lời, thì bạn nên làm như vậy trong một câu trả lời. Xin lưu ý nó là khủng khiếp unpythonic để sử dụng dấu chấm phẩy. Python có nghĩa là để có thể đọc được, và đặt nhiều câu lệnh trên một dòng là rất xấu cho dễ đọc. –

+0

@GarethLatty: anh ấy cũng không trả lời câu hỏi. – user443854

Trả lời

53

Đó là một quy ước bằng Python rằng các phương thức làm biến đổi chuỗi trở về None.

xem xét:

>>> a_list = [3, 2, 1] 
>>> print a_list.sort() 
None 
>>> a_list 
[1, 2, 3] 

>>> a_dict = {} 
>>> print a_dict.__setitem__('a', 1) 
None 
>>> a_dict 
{'a': 1} 

>>> a_set = set() 
>>> print a_set.add(1) 
None 
>>> a_set 
set([1]) 

Một số có thể xem xét ước này "một misdesign khủng khiếp bằng Python", nhưng thiết kế và Lịch sử FAQ gives the reasoning đằng sau quyết định thiết kế này (đối với danh sách với):

Tại sao không list.sort() trả lại danh sách được sắp xếp?

Trong trường hợp có hiệu suất, hãy sao chép danh sách chỉ để sắp xếp nó sẽ là lãng phí. Do đó, hãy list.sort() sắp xếp danh sách tại chỗ. Để nhắc bạn về thực tế đó, nó không trả về danh sách được sắp xếp. Bằng cách này, bạn sẽ không bị lừa vào vô tình ghi đè danh sách khi bạn cần bản sao được sắp xếp nhưng cũng cần giữ lại phiên bản chưa được phân loại xung quanh.

Trong Python 2.4 một hàm dựng sẵn mới - sorted() - đã được thêm vào. Chức năng này tạo danh sách mới từ một vòng lặp được cung cấp, sắp xếp nó và trả về nó.

Các vấn đề cụ thể của bạn với tính năng này xuất phát từ sự hiểu lầm về cách tốt để tạo tập hợp thay vì ngôn ngữ thiết kế sai. Như Lattyware points out, trong phiên bản Python 2.7 trở lên, bạn có thể sử dụng một tập hợp chữ a = {1} hoặc làm a = set([1]) theo số answer của Sven Marnach.

Thứ hai, tôi thích quy ước đặt dấu chấm than của Ruby sau các phương thức làm biến đổi đối tượng, nhưng tôi thấy phương pháp tiếp cận của Python có thể chấp nhận được.

4

add() được modifing đặt màn hình ở nơi trở về None:

>>> empty = set() 
>>> print(empty.add(1)) 
None 
>>> empty 
set([1]) 
1

Bạn nên làm điều này:

a = set() 
a.add(1) 
print a 

Chú ý rằng bạn đang gán cho a kết quả của thêm1, và hoạt động add, như được định nghĩa bằng Python, trả về None - và đó là những gì được giao cho a trong mã của bạn.

Ngoài ra, bạn có thể làm điều này cho khởi tạo một tập:

a = set([1, 2, 3]) 
24

Phương pháp add() thêm phần tử vào các thiết lập, nhưng nó không trả lại tập hợp một lần nữa - nó trả None.

a = set() 
a.add(1) 

hoặc tốt hơn

a = set([1]) 

sẽ làm việc.

+1

Cảm ơn. Điều đó có vẻ giống như một misdesign khủng khiếp trong Python. Bạn nghĩ sao? – Randomblue

+8

@Randomblue: Tôi nghĩ nếu nó hoàn toàn gây nhầm lẫn nếu 'set.add()' trả lại tập hợp một lần nữa. Tại sao nên làm thế? Quy ước là: Nếu nó thay đổi đối tượng tại chỗ, nó trả về 'None'. Nếu nó tạo ra một đối tượng mới, nó trả về đối tượng mới. Chỉ là cách nó được cho là. –

+0

@RandomBlue: Tôi đã tạo câu trả lời để trả lời câu hỏi tiếp theo của bạn. –

1

Phương thức thêm sẽ cập nhật tập hợp, nhưng trả về Không.

a = set() 
a.add(1) 
print a 
1

Bạn đang chỉ định giá trị trả về set().add(1) cho a. Giá trị này là None, vì add() không trả lại bất kỳ giá trị nào, thay vào đó nó hoạt động tại chỗ trên danh sách.

gì bạn muốn làm được điều này:

a = set() 
a.add(1) 
print(a) 

Tất nhiên, ví dụ này là tầm thường, nhưng Python không hỗ trợ bộ literals, vì vậy nếu bạn thực sự muốn làm điều này, nó tốt hơn để làm:

a = {1} 
print(a) 

Dấu ngoặc nhọn biểu thị tập hợp (mặc dù được cảnh báo, {} biểu thị một dict trống, không phải là bộ trống do thực tế là dấu ngoặc nhọn được sử dụng cho cả hai dấu gạch ngang và tập hợp (dấu gạch ngang được phân tách bằng cách sử dụng dấu hai chấm để phân tách khóa và giá trị.)

1

Một cách khác để làm điều đó có nghĩa là tương đối đơn giản sẽ là:

a = set() 
a = set() | {1} 

điều này tạo ra một sự kết hợp giữa bộ một mình và một bộ với 1 là yếu tố

in (a) sản lượng {1 } sau đó bởi vì bây giờ sẽ có tất cả các thành phần của cả một và {1}

0

Cách khác để a = set() | {1} xem xét "tại chỗ" điều hành:

a = set() 
a |= {1} 
Các vấn đề liên quan