Python có hai toán tử rất giống nhau để kiểm tra xem hai đối tượng có bằng nhau không. Hai toán tử này là
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 và x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0Chúng thường bị nhầm lẫn với nhau vì với các kiểu dữ liệu đơn giản, như
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1 và x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
2 [mà nhiều người bắt đầu học Python sử dụng], chúng dường như làm điều tương tựx = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
Chạy mã này sẽ dẫn đến
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
Điều này cho thấy rằng
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0 và some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 trả về cùng một giá trị [x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
5] trong những trường hợp này. Tuy nhiên, nếu bạn cố gắng làm điều này với một cấu trúc phức tạp hơnsome_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
Điều này sẽ dẫn đến
________số 8Ở đây rõ ràng là các toán tử này không giống nhau
Sự khác biệt đến từ thực tế là
0 kiểm tra danh tính [của các đối tượng], trong khisome_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
0 kiểm tra sự bằng nhau [của giá trị]x == 5: True x is 5: True s == 'example': True s is 'example': True
Đây là một ví dụ khác có thể làm rõ sự khác biệt giữa hai toán tử này
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0Kết quả này trong
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1Như chúng ta có thể thấy,
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
8 bằng với x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
9 theo giá trị [cả hai đều bằng some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0]], nhưng chúng không giống nhau, nghĩa là chúng không phải là cùng một đối tượng, mặc dù chúng có giá trị bằng nhauTuy nhiên,
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
8 vừa bằng vừa giống với some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
2 vì chúng tham chiếu cùng một đối tượng trong bộ nhớCác kiểu dữ liệu có thể thay đổi và không thể thay đổi
Mặc dù phần này của vấn đề bây giờ có thể rõ ràng [khi chúng ta đã đặt tên cho các biến], một câu hỏi khác có thể xuất hiện
Tại sao
0 vàsome_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
0 hoạt động giống nhau với các giá trịx == 5: True x is 5: True s == 'example': True s is 'example': True
1 vàx == 5: True x is 5: True s == 'example': True s is 'example': True
2 chưa được đặt tên [nhưx == 5: True x is 5: True s == 'example': True s is 'example': True
7 vàsome_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
8] nhưng không hoạt động giống nhau với các danh sách chưa được đặt tên [nhưsome_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
0]?some_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
Có hai loại kiểu dữ liệu trong Python - có thể thay đổi và không thay đổi
- Kiểu dữ liệu có thể thay đổi là kiểu dữ liệu mà bạn có thể "thay đổi" theo thời gian
- Các kiểu dữ liệu không thay đổi được giữ nguyên [có cùng vị trí bộ nhớ, đó là điều mà
0 kiểm tra] sau khi chúng được tạosome_list = [1] print["some_list == [1]: " + str[some_list == [1]]] print["some_list is [1]: " + str[some_list is [1]]]
Các kiểu dữ liệu có thể thay đổi là.
some_list == [1]: True
some_list is [1]: False
1, some_list == [1]: True
some_list is [1]: False
2, some_list == [1]: True
some_list is [1]: False
3 và các lớp do người dùng định nghĩaCác kiểu dữ liệu bất biến là.
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1, some_list == [1]: True
some_list is [1]: False
5, some_list == [1]: True
some_list is [1]: False
6, some_list == [1]: True
some_list is [1]: False
7, x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
2, some_list == [1]: True
some_list is [1]: False
9 và x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
00Giống như nhiều ngôn ngữ khác, Python xử lý các loại dữ liệu không thay đổi khác với các loại có thể thay đổi, tôi. e. chỉ lưu chúng vào bộ nhớ một lần
Vì vậy, mọi
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
7 bạn sử dụng trong mã của mình đều giống hệt với some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
7 bạn sử dụng ở những nơi khác trong mã của mình và điều tương tự cũng xảy ra với các chuỗi ký tự bạn sử dụngNếu bạn sử dụng chuỗi
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
8 một lần, mỗi lần bạn sử dụng some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
8, nó sẽ là cùng một đối tượng. Xem Ghi chú này để làm rõ thêmHãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
Chúng ta sẽ sử dụng một hàm Python có tên là
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
05 để in ra một mã định danh duy nhất cho từng đối tượng, để xem xét kỹ hơn về khái niệm có thể thay đổi này trong thực tếx = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
8kết quả đầu ra này
x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
9Chúng ta có thể thấy rằng trong phần đầu tiên của ví dụ,
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
06 đã trả về chính xác đối tượng some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
8 mà nó đã được gán lúc đầu, ngay cả khi chúng ta thay đổi giá trị của x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
06 trong thời gian chờ đợiTuy nhiên,
some_list == [1]: True
some_list is [1]: False
1 không trả về cùng một đối tượng có giá trị là some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0, nhưng một đối tượng hoàn toàn mới được tạo, ngay cả khi nó có cùng giá trị với some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 đầu tiênNếu bạn chạy mã ở trên, bạn có thể nhận được các ID khác nhau cho các đối tượng, nhưng các giá trị bằng nhau sẽ giống nhau
Khi nào 'là' và '==' được sử dụng tương ứng?
Toán tử
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 được sử dụng phổ biến nhất khi chúng ta muốn so sánh đối tượng với x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
13 và việc hạn chế sử dụng nó trong trường hợp cụ thể này thường được khuyên trừ khi bạn thực sự [và ý tôi là thực sự] muốn kiểm tra xem hai đối tượng có giống nhau khôngNgoài ra,
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 thường nhanh hơn toán tử x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0 vì nó chỉ đơn giản kiểm tra sự bằng nhau về số nguyên của địa chỉ bộ nhớLưu ý quan trọng. Tình huống duy nhất khi
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 hoạt động chính xác như mong đợi là với các lớp/đối tượng đơn lẻ [như x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
13]. Ngay cả với các đối tượng bất biến, vẫn có những tình huống mà some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 không hoạt động như mong đợiVí dụ: đối với các đối tượng
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
2 lớn được tạo bởi một số logic mã hoặc các x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1 lớn, some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 có thể [và sẽ] hoạt động không thể đoán trước. Trừ khi bạn trải qua nỗ lực thực tập [tôi. e. đảm bảo tuyệt đối rằng chỉ có một bản sao của x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
2/x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1/etc. tồn tại], tất cả các đối tượng bất biến khác nhau mà bạn định sử dụng, some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 sẽ không thể đoán trướcĐiểm mấu chốt là. sử dụng
0 trong 99% trường hợpx == 5: True x is 5: True s == 'example': True s is 'example': True
Nếu hai đối tượng giống hệt nhau thì chúng cũng bằng nhau và điều ngược lại không nhất thiết đúng
Ghi đè '==' và '. =' Toán tử
Các nhà khai thác
x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
86 và x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
87 hành xử theo cách tương tự như các đối tác "tích cực" của họ làm. Cụ thể, x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
86 trả về x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
5 nếu các đối tượng không có cùng giá trị, trong khi x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
87 trả về x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
5 nếu các đối tượng không được lưu trữ trong cùng một địa chỉ bộ nhớMột điểm khác biệt nữa giữa hai toán tử này là bạn có thể ghi đè hành vi của
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0/x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
86 đối với một lớp tùy chỉnh, trong khi bạn không thể ghi đè hành vi của some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0Nếu bạn triển khai một phương thức
x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
95 tùy chỉnh trong lớp của mình, bạn có thể thay đổi cách hoạt động của toán tử x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0/x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
86Kết quả này trong
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
5Phần kết luận
Tóm lại,
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0/x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
86 kiểm tra sự bằng nhau [theo giá trị] và some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0/x = 5
s = "example"
print["x == 5: " + str[x == 5]]
print["x is 5: " + str[x is 5]]
print["s == 'example': " + str[s == "example"]]
print["s is 'example': " + str[s is "example"]]
87 kiểm tra xem hai đối tượng có giống nhau không, tôi. e. kiểm tra địa chỉ bộ nhớ của họTuy nhiên, tránh sử dụng
some_list = [1]
print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 trừ khi bạn biết chính xác mình đang làm gì hoặc khi xử lý các đối tượng đơn lẻ như x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
13, vì nó có thể hoạt động không thể đoán trước