Hướng dẫn check none in python - không kiểm tra trong python

Trong số này không phải là không có bài kiểm tra.

if val != None:

if not (val is None):

if val is not None:

Cái nào thích hợp hơn, và tại sao?

Hướng dẫn check none in python - không kiểm tra trong python

LOSPEJOS

1.9683 huy hiệu vàng19 Huy hiệu bạc33 Huy hiệu đồng3 gold badges19 silver badges33 bronze badges

Hỏi ngày 19 tháng 10 năm 2010 lúc 3:20Oct 19, 2010 at 3:20

Prosseekprosseeekprosseek

Phim thương hiệu vàng 174K200549 Huy hiệu bạc848 Huy hiệu đồng200 gold badges549 silver badges848 bronze badges

2

if val is not None:
    # ...

là thành ngữ pythonic để kiểm tra rằng một biến không được đặt thành

if val is not None:
    # ...
1. Thành ngữ này có cách sử dụng đặc biệt trong trường hợp khai báo các chức năng từ khóa với các tham số mặc định.
if val is not None:
    # ...
2 Kiểm tra danh tính trong Python. Bởi vì có một và chỉ một phiên bản của
if val is not None:
    # ...
1 có trong tập lệnh/chương trình Python đang chạy,
if val is not None:
    # ...
2 là thử nghiệm tối ưu cho việc này. Như Johnsyweb chỉ ra, điều này được thảo luận trong PEP 8 theo "Khuyến nghị lập trình".

Về lý do tại sao điều này được ưu tiên hơn

if not (val is None):
    # ...

Đây chỉ đơn giản là một phần của Zen of Python: "Khả năng đọc." Python tốt thường gần với mã giả tốt.

Đã trả lời ngày 19 tháng 10 năm 2010 lúc 3:24Oct 19, 2010 at 3:24

9

Từ, Khuyến nghị lập trình, PEP 8:

So sánh với những người độc thân như không nên luôn luôn được thực hiện với

if val is not None:
    # ...
2 hoặc
if val is not None:
    # ...
6, không bao giờ là nhà khai thác bình đẳng.

Ngoài ra, hãy cẩn thận khi viết

if val is not None:
    # ...
7 khi bạn thực sự có nghĩa là
if val is not None:
    # ...
8 - ví dụ: Khi kiểm tra xem một biến hoặc đối số mặc định là không có được đặt ở một số giá trị khác. Giá trị khác có thể có một loại (chẳng hạn như một thùng chứa) có thể sai trong bối cảnh boolean!

PEP 8 là cách đọc cần thiết cho bất kỳ lập trình viên Python nào.

Đã trả lời ngày 19 tháng 10 năm 2010 lúc 3:35Oct 19, 2010 at 3:35

Johnsywebjohnsywebjohnsyweb

Huy hiệu vàng 132K2323 gold badges178 silver badges239 bronze badges

0

Đặt cược tốt nhất với các loại câu hỏi này là xem chính xác những gì Python làm. Mô -đun

if val is not None:
    # ...
9 là vô cùng thông tin:

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

Lưu ý rằng hai trường hợp cuối cùng giảm xuống cùng một chuỗi hoạt động, Python đọc

if not (val is None):
    # ...
0 và sử dụng toán tử
if val is not None:
    # ...
6. Đầu tiên sử dụng toán tử
if not (val is None):
    # ...
2 khi so sánh với
if val is not None:
    # ...
1.

Như đã chỉ ra bởi các câu trả lời khác, sử dụng

if not (val is None):
    # ...
2 khi so sánh với
if val is not None:
    # ...
1 là một ý tưởng tồi.

Đã trả lời ngày 20 tháng 10 năm 2013 lúc 19:44Oct 20, 2013 at 19:44

SheetJSsheetjsSheetJS

21.7K12 Huy hiệu vàng63 Huy hiệu bạc75 Huy hiệu đồng12 gold badges63 silver badges75 bronze badges

2

Một trong hai phần sau, vì

if not (val is None):
    # ...
6 có khả năng có thể thuộc loại xác định
if not (val is None):
    # ...
7 để trả về true khi được thông qua
if val is not None:
    # ...
1.

Đã trả lời ngày 19 tháng 10 năm 2010 lúc 3:23Oct 19, 2010 at 3:23

1

Kiểm tra xem một biến không có trong Python #

Sử dụng toán tử

if val is not None:
    # ...
2 để kiểm tra xem một biến không có trong Python, ví dụ:
>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
0. Toán tử
if val is not None:
    # ...
2 trả về
>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
2 nếu các giá trị ở các cạnh bên trái và bên phải chỉ vào cùng một đối tượng và nên được sử dụng khi kiểm tra các singleton như
if val is not None:
    # ...
1.

Copied!

my_var = None # ✅ Check if variable is None if my_var is None: # 👇️ this runs print('variable is None') # ✅ Check if variable is NOT None if my_var is not None: print('variable is not None')

Câu lệnh

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
4 đầu tiên kiểm tra xem biến có lưu trữ giá trị
if val is not None:
    # ...
1 hay không - nếu biến không lưu trữ giá trị
if val is not None:
    # ...
1.

Bạn nên sử dụng toán tử

if val is not None:
    # ...
2 khi bạn cần kiểm tra xem biến có lưu trữ giá trị
if val is not None:
    # ...
1 không.

Khi chúng tôi sử dụng

if val is not None:
    # ...
2, chúng tôi kiểm tra danh tính của đối tượng.

Hướng dẫn theo phong cách PEP 8 đề cập rằng so sánh với các đơn lẻ như

if val is not None:
    # ...
1 luôn luôn được thực hiện với
if val is not None:
    # ...
2 hoặc
if val is not None:
    # ...
6 và không bao giờ là người vận hành bình đẳng.

Sử dụng các toán tử bình đẳng (bằng

Copied!

my_var = None # ✅ Check if variable is None if my_var is None: # 👇️ this runs print('variable is None') # ✅ Check if variable is NOT None if my_var is not None: print('variable is not None')
3 và không bằng
if not (val is None):
    # ...
2) khi bạn cần kiểm tra xem giá trị có bằng với giá trị khác không, ví dụ:

Copied!

my_var = None # ✅ Check if variable is None if my_var is None: # 👇️ this runs print('variable is None') # ✅ Check if variable is NOT None if my_var is not None: print('variable is not None')
5.

Dưới đây là một ví dụ minh họa tốt hơn việc kiểm tra danh tính (

if val is not None:
    # ...
2) so với kiểm tra bình đẳng (

Copied!

my_var = None # ✅ Check if variable is None if my_var is None: # 👇️ this runs print('variable is None') # ✅ Check if variable is NOT None if my_var is not None: print('variable is not None')
3).

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True

Chúng tôi đã tuyên bố 2 biến lưu trữ cùng một danh sách.

Chúng tôi đặt biến thứ hai thành biến thứ nhất, vì vậy cả hai biến đều chỉ vào cùng một đối tượng

Copied!

my_var = None # ✅ Check if variable is None if my_var is None: # 👇️ this runs print('variable is None') # ✅ Check if variable is NOT None if my_var is not None: print('variable is not None')
8 trong bộ nhớ.

Bây giờ, hãy tạo một bản sao nông của danh sách và gán nó cho biến thứ hai.

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True

Lưu ý rằng kiểm tra danh tính không thành công. Mặc dù hai danh sách lưu trữ cùng một giá trị, theo cùng một thứ tự, chúng chỉ ra các vị trí khác nhau trong bộ nhớ (chúng không phải là cùng một đối tượng).

Khi chúng tôi sử dụng toán tử bằng kép, Python gọi phương thức

if not (val is None):
    # ...
7 trên đối tượng.

Đó là

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True
0 gọi

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True
1. Về lý thuyết, phương pháp này có thể được thực hiện theo cách không thể đoán trước, vì vậy việc kiểm tra
if val is not None:
    # ...
1 với toán tử
if val is not None:
    # ...
2 trực tiếp hơn.

Bạn có thể sử dụng hàm id () để có được danh tính của một đối tượng.

Copied!

my_first_list = ['a', 'b', 'c'] print(id(my_first_list)) # 👉️ 139944523741504 my_second_list = my_first_list.copy() print(id(my_second_list)) # 👉️ 139944522293184 print(id(my_first_list) == id(my_second_list)) # 👉️ False

Hàm trả về một số nguyên, được đảm bảo là duy nhất và không đổi cho tuổi thọ của đối tượng.

Hàm

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True
4 trả về địa chỉ của đối tượng trong bộ nhớ trong cpython.

Nếu hai biến đề cập đến cùng một đối tượng, hàm

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True
4 sẽ tạo ra cùng một kết quả.

Copied!

my_first_list = ['a', 'b', 'c'] print(id(my_first_list)) # 👉️ 140311440685376 my_second_list = my_first_list print(id(my_second_list)) # 👉️ 140311440685376 print(id(my_first_list) == id(my_second_list)) # 👉️ True

Chuyển giá trị

if val is not None:
    # ...
1 cho hàm

Copied!

my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list # 👈️ same list as above print(my_first_list is my_second_list) # 👉️ True print(my_first_list == my_second_list) # 👉️ True
4 luôn luôn trả về kết quả tương tự vì chỉ có một trường hợp của
if val is not None:
    # ...
1 trong chương trình Python.

Copied!

print(id(None)) # 👉️ 9817984 print(id(None)) # 👉️ 9817984

Bạn cũng có thể thấy các ví dụ trực tuyến kiểm tra sự thật.

if val is not None:
    # ...
0

Tuy nhiên, điều này rất khác so với kiểm tra rõ ràng nếu một biến lưu trữ giá trị

if val is not None:
    # ...
1 vì có nhiều giá trị giả khác không phải là
if val is not None:
    # ...
1.

Tất cả các giá trị không phải là sự thật được coi là giả mạo.Các giá trị giả trong Python là:

  • Các hằng số được xác định là giả mạo:
    if val is not None:
        # ...
    
    1 và

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    2.
  • Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    3 (không) thuộc bất kỳ loại số nào
  • Trình tự trống và bộ sưu tập:

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    4 (Chuỗi trống),

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    5 (Tuple trống),

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    6 (danh sách trống),

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    7 (Từ điển trống),

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    8 (bộ trống),

    Copied!

    my_first_list = ['a', 'b', 'c'] my_second_list = my_first_list.copy() # 👈️ copy created print(my_first_list is my_second_list) # 👉️ False print(my_first_list == my_second_list) # 👉️ True
    9 (phạm vi trống).

Nếu bạn kiểm tra xem một biến có phải là sự thật hay không, bạn đang kiểm tra xem biến không phải là bất kỳ giá trị giả nào đã nói ở trên, không chỉ

if val is not None:
    # ...
1.