Python so sánh hai đối tượng và nhận được sự khác biệt

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
0

Chú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ơn

some_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à

some_list = [1]

print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
0 kiểm tra danh tính [của các đối tượng], trong khi
x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0 kiểm tra sự bằng nhau [của giá trị]

Đâ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
0

Kết quả này trong

x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
1

Như 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 nhau

Tuy 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

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
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ư
some_list = [1]

print["some_list == [1]: " + str[some_list == [1]]]
print["some_list is [1]: " + str[some_list is [1]]]
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]?

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à
    some_list = [1]
    
    print["some_list == [1]: " + str[some_list == [1]]]
    print["some_list is [1]: " + str[some_list is [1]]]
    
    0 kiểm tra] sau khi chúng được tạo

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ĩa

Cá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
00

Giố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ụng

Nế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êm

Hã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"]]
8

kế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"]]
9

Chú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ờ đợi

Tuy 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ên

Nế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ông

Ngoà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 đợi

Ví 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

x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
0 trong 99% trường hợp

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]]]
0

Nế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"]]
86

Kết quả này trong

x == 5: True
x is 5: True
s == 'example': True
s is 'example': True
5

Phầ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

__ EQ __ trong Python là gì?

__eq__[bản thân. dtype, khác. dtype, /] → bool. Tính toán giá trị thực của self == other để kiểm tra tính bằng nhau của đối tượng kiểu dữ liệu .

Chúng ta có thể so sánh kiểu trong Python không?

Python có một hàm tích hợp gọi là instance[] so sánh giá trị với loại đã cho . Giá trị và loại đã cho khớp với nhau, nó sẽ trả về true nếu không sẽ trả về false. Sử dụng isinstance[], bạn có thể kiểm tra chuỗi, float, int, list, tuple, dict, set, class, v.v.

Sự khác biệt giữa và là toán tử trong Python là gì?

Mặt khác, chúng ta sử dụng toán tử == khi muốn so sánh giá trị của hai đối tượng. . Sự khác biệt giữa toán tử == và is trong Python

Các đối tượng giống hệt nhau và tương đương trong Python là gì?

== dành cho bình đẳng giá trị. Nó được sử dụng để biết liệu hai đối tượng có cùng giá trị hay không. là để tham khảo bình đẳng. Nó được sử dụng để biết liệu hai tham chiếu có tham chiếu [hoặc điểm] đến cùng một đối tượng hay không. e nếu chúng giống hệt nhau. Hai đối tượng giống hệt nhau nếu chúng có cùng địa chỉ bộ nhớ .

Chủ Đề