ทำไมเมื่อฉันเปลี่ยนลำดับของทั้งสองชุดในสหภาพแรงงานด้านล่างฉันจึงได้ผลลัพธ์ที่แตกต่างกัน
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
ทำไมเมื่อฉันเปลี่ยนลำดับของทั้งสองชุดในสหภาพแรงงานด้านล่างฉันจึงได้ผลลัพธ์ที่แตกต่างกัน
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
คำตอบ:
1
และTrue
เทียบเท่าและถือว่าเป็นรายการที่ซ้ำกัน ในทำนองเดียวกัน0
และFalse
เทียบเท่าเช่นกัน:
>>> 1 == True
True
>>> 0 == False
True
เมื่อพบค่าที่เทียบเท่าหลายค่าชุดจะเก็บค่าแรกที่เห็น:
>>> {0, False}
{0}
>>> {False, 0}
{False}
เพื่อให้ได้รับการปฏิบัติที่แตกต่างกันเพียงจัดเก็บไว้ใน(value, type)
คู่:
>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
(True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()
อีกวิธีหนึ่งในการทำให้ค่าแตกต่างกันคือการจัดเก็บเป็นสตริง:
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
หวังว่าสิ่งนี้จะช่วยไขปริศนาและแสดงให้เห็นทางไปข้างหน้า :-)
ได้รับการช่วยเหลือจากความคิดเห็น:
นี้เป็นเทคนิคมาตรฐานสำหรับการทำลาย cross-type เท่าเทียมกัน (เช่น0.0 == 0
, True == 1
และDecimal(8.5) == 8.5)
. เทคนิคที่ใช้ในการแสดงออกโมดูลหลาม 2.7 ปกติที่จะมีผลบังคับใช้ regexes Unicode จะถูกเก็บไว้อย่างชัดเจนจากเทียบเท่ามิฉะนั้น regexes Str. เทคนิคที่ใช้ในหลาม 3 สำหรับ functools.lru_cache () เมื่อพารามิเตอร์ที่พิมพ์เป็นจริง
หาก OP ต้องการสิ่งอื่นที่ไม่ใช่ความสัมพันธ์การเทียบเท่าเริ่มต้นจำเป็นต้องกำหนดความสัมพันธ์ใหม่ ขึ้นอยู่กับกรณีการใช้งานซึ่งอาจเป็นกรณีที่ไม่คำนึงถึงตัวพิมพ์สำหรับสตริงการทำให้เป็นมาตรฐานสำหรับ Unicode ลักษณะที่มองเห็น (สิ่งที่ดูแตกต่างกันถือว่าแตกต่างกัน) เอกลักษณ์ (ไม่มีวัตถุที่แตกต่างกันสองชิ้นที่ถือว่าเท่ากัน) คู่ค่า / ประเภทหรืออื่น ๆ ฟังก์ชันที่กำหนดความสัมพันธ์การเทียบเท่า จากตัวอย่างเฉพาะของ OPs ดูเหมือนว่าเขา / เธอคาดหวังความแตกต่างตามประเภทหรือความแตกต่างของภาพ
ใน Python False
และ0
ถือว่าเทียบเท่าเช่นเดียวกับTrue
และ1
. เนื่องจากTrue
และ1
ถือเป็นค่าเดียวกันจึงสามารถแสดงได้เพียงค่าเดียวในช่วงเวลาเดียวกัน อันไหนขึ้นอยู่กับลำดับที่เพิ่มเข้าไปในชุดในบรรทัดแรกset1
จะใช้เป็นชุดแรกดังนั้นเราจึงได้1
ชุดผลลัพธ์ ในชุดที่สองTrue
อยู่ในชุดแรกดังนั้นจึงTrue
รวมอยู่ในผลลัพธ์
หากคุณดูhttps://docs.python.org/3/library/stdtypes.html#boolean-valuesหัวข้อ 4.12.10 ค่าบูลีน:
ค่าบูลีนเป็นสองคงวัตถุเท็จและทรู ใช้เพื่อแสดงค่าความจริง (แม้ว่าค่าอื่น ๆ อาจถือได้ว่าเป็นเท็จหรือเป็นจริง) ในบริบทที่เป็นตัวเลข (ตัวอย่างเช่นเมื่อใช้เป็นอาร์กิวเมนต์ของตัวดำเนินการทางคณิตศาสตร์) พวกเขาจะทำงานเหมือนจำนวนเต็ม 0 และ 1ตามลำดับ
ตัวดำเนินการเปรียบเทียบ ( ==
, !=
) ถูกกำหนดสำหรับบูลีนTrue
และFalse
เพื่อให้ตรงกับ 1 และ 0
นั่นเป็นเหตุผลว่าทำไมในเซตยูเนี่ยนเมื่อตรวจสอบว่าTrue
อยู่ในเซตใหม่แล้วจะได้รับคำตอบที่แท้จริง:
>>> True in {1}
True
>>> 1 in {True}
True