sách gpt4 ai đã đi

Giải thích chi tiết về toán tử is trong Python

In lại Tác giả:qq735679552 Thời gian cập nhật: 2022-09-28 22:32:09 29 4
mua khóa gpt4 Nike

CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.

Bài đăng trên blog CFSDN này giải thích chi tiết về toán tử is trong Python. Bài viết được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

Bạn có thể xác minh điều này bằng toán tử == trong Java để hiểu sâu hơn về tham chiếu và đối tượng. Câu hỏi gốc: Tại sao Python lại đưa ra kết quả khác nhau khi chạy cùng một câu lệnh trực tiếp và trong dòng lệnh? Cơ chế lưu trữ đệm của chúng có khác nhau không?

Trên thực tế, câu trả lời được bình chọn nhiều nhất đã giải thích chi tiết rồi. Tôi chỉ muốn nói thêm một điều nữa thôi.

Toán tử is là toán tử tích hợp sẵn trong ngôn ngữ Python. Chức năng của nó là so sánh xem hai biến có tham chiếu đến cùng một đối tượng hay không.

Sự khác biệt từ ==.

?
1
2
3
4
5
6
7
8
9
lớp học MỘT():
  định nghĩa __khởi tạo__( bản thân , v.v):
   bản thân .giá trị = v
  định nghĩa __eq__( bản thân , t):
   trở lại bản thân .giá trị = = giá trị t
Một = MỘT( 3 )
b = MỘT( 3 )
in Một = = b
in Một b

Kết quả là Đúng, Sai. Vì chúng ta đã viết lại phương thức __eq__ nên khi so sánh a và b, chúng ta chỉ cần so sánh giá trị của chúng. Chỉ cần giá trị của chúng bằng nhau thì a và b bằng nhau.

Toán tử is xác định xem hai biến có tham chiếu đến cùng một đối tượng hay không.

Cùng một vật phải không?

Cách sử dụng của is thực ra khá đơn giản khi nói, nhưng trong thực tế sử dụng, khó khăn nằm ở việc xác định những đối tượng nào là cùng một đối tượng.

Hãy xem các bài kiểm tra sau. Nếu không xem kết quả, bạn có thể trả lời đúng bao nhiêu câu?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Một = 10
b = 10
in Một b
Một = 10.0
b = 10.0
in Một b
Một = 10
định nghĩa f():
  trở lại 10
in f() Một
Một = 1000
định nghĩa f():
  trở lại 1000
in f() Một
Một = 10.0
định nghĩa f():
  trở lại 10.0
in f() Một

Ừm. Kết quả là Đúng, Đúng, Đúng, Sai, Sai. Bạn có hiểu đúng không?

Kết quả này liên quan đến hai vấn đề: thứ nhất, bộ nhớ đệm các số nguyên nhỏ và thứ hai, cách tổ chức CodeObject trong tệp pyc.

Python lưu trữ đệm các số nguyên nhỏ từ -127 đến 128. Lớp này giống với lớp Integer của Java. Do đó, đối với các số nguyên từ -127 đến 128, chỉ có một phiên bản duy nhất trong toàn bộ máy ảo Python. Bất kể khi nào và ở đâu bạn sử dụng is để đưa ra phán đoán, nó sẽ là Đúng, vì vậy chúng ta biết rằng hai bài kiểm tra này chắc chắn sẽ Đúng

?
1
2
3
4
5
6
7
Một = 10
b = 10
in Một b
Một = 10
định nghĩa f():
  trở lại 10
in f() Một

Tiếp theo, chúng ta hãy tập trung vào hai bài kiểm tra này:

?
1
2
3
4
5
6
7
Một = 10.0
b = 10.0
in Một b
Một = 10.0
định nghĩa f():
  trở lại 10.0
in f() Một

Tại sao một cái là Đúng, một cái là Sai? Để khám phá vấn đề này, chúng ta cần phân tích nó theo góc nhìn của bytecode. Trước tiên chúng ta hãy biên dịch tập tin này:

?
1
Trăn - m biên dịch tất cả testis.py

Sau đó sử dụng công cụ này để xem tệp bytecode: .

  https://github.com/hinus/railgun/blob/master/src/main/python/rgparser/show.py.

Đây là kết quả đầu ra:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
0 < / số lượng đối số>
0 < / nlocals>
2 < / kích thước ngăn xếp>
0040 < / cờ>
  6400005a00006400005a01006500006501006b080047486400005a000064
  01008400005a02006502008300006500006b0800474864020053
< / Mã>
1   0 TẢI_XÂY_DỰNG    0 ( 10.0 )
    3 TÊN_CỬA_SỬA    0 (Một)
 
2   6 TẢI_XÂY_DỰNG    0 ( 10.0 )
    9 TÊN_CỬA_SỬA    1 (b)
 
3   12 TẢI_TÊN    0 (Một)
    15 TẢI_TÊN    1 (b)
    18 SO SÁNH_OP    8 ( )
    hai mươi mốt MỤC IN  
    hai mươi hai IN_DÒNG MỚI 
 
5   hai mươi ba TẢI_XÂY_DỰNG    0 ( 10.0 )
    26 TÊN_CỬA_SỬA    0 (Một)
 
6   29 TẢI_XÂY_DỰNG    1 ( sự vật f>)
    32 CHỨC_NĂNG_LÀM   0
    35 TÊN_CỬA_SỬA    2 (đ)
 
8   38 TẢI_TÊN    2 (đ)
    41 CHỨC_NĂNG_GỌI   0
    44 TẢI_TÊN    0 (Một)
    47 SO SÁNH_OP    8 ( )
    50 MỤC IN  
    51 IN_DÒNG MỚI 
    52 TẢI_XÂY_DỰNG    2 ( Không có )
    55 GIÁ TRỊ TRẢ VỀ 
< / xem>
( 'Một' , 'b' , 'f' )< / tên>
()< / tên biến thể>
()< / freevar>
()< / tế bào>
'testis.py' < / tên tập tin>
'' < / tên>
1 < / dòng đầu tiênkhông>
  10.0
 
   0 < / số lượng đối số>
   0 < / nlocals>
   1 < / kích thước ngăn xếp>
   0043 < / cờ>
   64010053 < / Mã>
  
7   0 TẢI_XÂY_DỰNG    1 ( 10.0 )
    3 GIÁ TRỊ TRẢ VỀ 
   < / xem>
   ()< / tên>
   ()< / tên biến thể>
   ()< / freevar>
   ()< / tế bào>
   'testis.py' < / tên tập tin>
   'f' < / tên>
   6 < / dòng đầu tiênkhông>
  
   Không có
   10.0
   < / hằng số>
   0001 < / lnotab>
  < / Mã>
  Không có
< / hằng số>
060106010b0206010902 < / lnotab>

Xin lưu ý rằng toàn bộ tệp Python thực sự là một đối tượng lớn. Hàm tương ứng với f cũng là một đối tượng . Đối tượng mã nói chung là một mục const trong trường consts của đối tượng lớn. Lưu ý rằng trong đối tượng big, có một mục const được gọi là 10.0 và trong các conts tương ứng với đối tượng f, cũng có một số dấu phẩy động là 10.0.

Khi Python tải tệp này, nó sẽ hoàn tất việc tải số dấu phẩy động 10.0 trong chính và tạo ra một PyFloatObject. Có nghĩa là, sau khi bảng hằng số của tệp pyc tĩnh được tải, nó sẽ trở thành bảng hằng số trong bộ nhớ và 10.0 trong bảng của tệp sẽ trở thành PyFloatObject trong bộ nhớ. Do đó, cả hai biến a và b sẽ tham chiếu đến PyFloatObject này.

Nhưng còn 10.0 ở f thì sao? Nó sẽ không thực sự được khởi tạo cho đến khi MAKE_FUNCTION được gọi. Giá trị trả về của phương thức f phải khác với giá trị 10.0 trong main mà chúng ta đã đề cập trước đó.

Về cơ bản, đây là một lỗi thiết kế trong Python (ví dụ, Java sử dụng một tệp làm đơn vị biên dịch và chia sẻ cùng một nhóm hằng số để giảm bớt vấn đề này. Nhưng nếu toán tử == được sử dụng trên nhiều tệp, vấn đề tương tự sẽ xảy ra. Vấn đề này vẫn chưa được giải quyết. Trên thực tế, bản thân tôi không biết cách giải quyết vấn đề này.) Chúng ta nên cố gắng tránh sử dụng is này. Luôn giới hạn việc sử dụng "is" ở ví dụ đầu tiên trong bài viết này. Cách này sẽ an toàn hơn nhiều.

Liên kết gốc: https://zhuanlan.zhihu.com/p/32351552?utm_source=tuicool&utm_medium=referral .

Cuối cùng, bài viết này về giải thích chi tiết về toán tử is trong Python ở đây. Nếu bạn muốn biết thêm về giải thích chi tiết về toán tử is trong Python, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

29 4 0
qq735679552
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com