2016-02-14 19 views
9

None trong Python là một từ dành riêng, chỉ một câu hỏi bắt đầu suy nghĩ về giá trị chính xác của None trong bộ nhớ. Những gì tôi đang nắm giữ trong tâm trí của tôi là điều này, None 's đại diện trong bộ nhớ là 0 hoặc một con trỏ trỏ đến một đống. Nhưng không con trỏ nào trỏ tới vùng trống trong bộ nhớ sẽ có nghĩa là cả giá trị 0. Bởi vì khi tôi thử nghiệm như sau:Giá trị của None trong bộ nhớ là gì?

>>> None.__sizeof__() 
16 

Nó chỉ ra rằng None tiêu thụ 16 byte và đó là thực sự quá nhiều cho chỉ đơn giản là một giá trị rỗng.

Vì vậy, những gì hiện None thực sự đại diện trong bộ nhớ?

+2

http://stackoverflow.com/questions/19473185/what-is-a-none-value –

+0

'None' không đại diện cho giá trị trống. Đó là một đối tượng đại diện cho sự vắng mặt của giá trị. – Alessiox

Trả lời

11

None là đối tượng đơn lẻ không cung cấp (gần như) không có phương pháp và thuộc tính nào và mục đích duy nhất của nó là biểu thị thực tế là không có giá trị cho một số hoạt động cụ thể.

Là một đối tượng thực, nó vẫn cần phải có một số tiêu đề, một số thông tin phản chiếu và những thứ tương tự để nó chiếm bộ nhớ tối thiểu bị chiếm bởi mọi đối tượng python.

4

None tham chiếu một số đối tượng Python của NoneType, thực sự là trường hợp duy nhất thuộc loại này. Vì nó là một đối tượng Python — giống như mọi thứ khác — nó không chỉ là nội dung thô được lưu trữ cũng như thông tin đối tượng bổ sung như loại của nó.

Mọi đối tượng đều có chi phí này; đó là lý do tại sao các số nguyên bắt đầu với kích thước 28 chẳng hạn. Bạn không thể thay đổi điều này, nó là một chi tiết thực hiện của Python và hệ thống kiểu của nó.

+0

Đó là những gì tôi đang nghĩ đến, nhưng tôi quên đề cập đến điều này. – direprobs

2

Không có một hằng số đặc biệt trong Python biểu thị sự vắng mặt của giá trị hoặc giá trị rỗng. Nó là một đối tượng của kiểu dữ liệu riêng của nó, NoneType. Chúng ta không thể tạo nhiều đối tượng None nhưng có thể gán nó cho các biến. Các biến này sẽ bằng nhau. Chúng ta phải chăm sóc đặc biệt mà Không không bao hàm False, 0 hoặc bất kỳ danh sách trống, từ điển, chuỗi vv Ví dụ: chức năng

>>> None == 0 
False 
>>> None == [] 
False 
>>> None == False 
False 
>>> x = None 
>>> y = None 
>>> x == y 
True 

Void mà không quay trở lại bất cứ điều gì sẽ trả về một đối tượng Không tự động. Không có gì cũng được trả về bởi các hàm trong đó luồng chương trình không gặp phải một câu lệnh trả về. Ví dụ:

def a_void_function(): 
    a = 1 
    b = 2 
    c = a + b 

x = a_void_function() 
print(x) 

Output: None

Chương trình này có một chức năng mà không trả lại một giá trị, mặc dù nó hiện một số hoạt động bên trong. Vì vậy, khi chúng tôi in x, chúng tôi nhận được Không có gì được trả về tự động (ngầm). Tương tự như vậy, đây là một ví dụ:

def improper_return_function(a): 
    if (a % 2) == 0: 
     return True 

x = improper_return_function(3) 
print(x) 

Output: None

Mặc dù chức năng này có một tuyên bố trở lại, nó không đạt được trong mọi trường hợp. Hàm sẽ trả về True chỉ khi đầu vào là chẵn. Vì vậy, nếu chúng ta cung cấp cho hàm một số lẻ, không có gì được trả về ngầm.

0

Nó chỉ ra rằng Không có tiêu thụ 16 byte và thực sự quá nhiều cho chỉ đơn giản là một giá trị rỗng.

Không có giá trị nào trống. Nó là một đối tượng NoneType đại diện cho sự vắng mặt của một giá trị như bạn có thể đọc ở đây: Python Built-in constants Doc. Bạn có thể gán None cho các biến, nhưng bạn không thể gán cho Không, vì nó sẽ làm tăng lỗi cú pháp.

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