หากคุณมาที่ Python จากภาษาใน C / Java / etc ครอบครัวมันอาจช่วยให้คุณเลิกคิดaว่าเป็น "ตัวแปร" และเริ่มคิดว่ามันเป็น "ชื่อ"
a, bและcไม่ได้เป็นตัวแปรที่แตกต่างกันมีค่าเท่ากัน เป็นชื่อที่แตกต่างกันสำหรับค่าที่เหมือนกัน ตัวแปรมีประเภทอัตลักษณ์ที่อยู่และทุกประเภทเช่นนั้น
ชื่อไม่มีเลย ค่าทำของหลักสูตรและคุณสามารถมีจำนวนมากของชื่อสำหรับค่าเดียวกัน
หากคุณให้Notorious B.I.G.สุนัขร้อน * Biggie SmallsและChris Wallaceมีสุนัขร้อน หากคุณเปลี่ยนองค์ประกอบแรกของaเป็น 1 องค์ประกอบแรกของbและcคือ 1
หากคุณต้องการทราบว่าสองชื่อตั้งชื่อวัตถุเดียวกันหรือไม่ให้ใช้ตัวisดำเนินการ:
>>> a=b=c=[0,3,5]
>>> a is b
True
จากนั้นคุณถาม:
อะไรที่แตกต่างจากนี้?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
ที่นี่คุณกำลังเชื่อมโยงชื่อeกับค่า4อีกครั้ง นั่นไม่ส่งผลกระทบต่อชื่อdและfแต่อย่างใด
ในรุ่นก่อนหน้าของคุณคุณได้รับมอบหมายให้ไม่a[0] aดังนั้นจากมุมมองของa[0]คุณคุณกำลังตอบa[0]กลับ แต่จากมุมมองของaคุณกำลังเปลี่ยนมันในสถานที่
คุณสามารถใช้idฟังก์ชั่นซึ่งจะให้หมายเลขเฉพาะที่แสดงถึงเอกลักษณ์ของวัตถุเพื่อดูว่าวัตถุใดเป็นสิ่งที่แม้ว่าisจะช่วยไม่ได้ก็ตาม:
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
สังเกตว่าa[0]เปลี่ยนจาก 4297261120 เป็น 4297261216 ตอนนี้เป็นชื่อสำหรับค่าอื่น และb[0]ตอนนี้ยังเป็นชื่อสำหรับค่าใหม่เดียวกัน นั่นเป็นเพราะaและbยังคงตั้งชื่อวัตถุเดียวกัน
ภายใต้การครอบคลุมa[0]=1กำลังเรียกใช้เมธอดบนวัตถุรายการ (มันเทียบเท่ากับa.__setitem__(0, 1).) ดังนั้นก็ไม่ได้จริงๆ rebinding อะไรเลย มันชอบโทรmy_object.set_something(1). แน่นอนว่าเป็นไปได้ว่าวัตถุกำลังเชื่อมโยงแอตทริบิวต์อินสแตนซ์เพื่อใช้วิธีนี้ แต่นั่นไม่ใช่สิ่งสำคัญ สิ่งที่สำคัญคือคุณไม่ได้กำหนดอะไรเลยคุณแค่กลายพันธุ์วัตถุ a[0]=1และมันก็เป็นเช่นเดียวกันกับ
user570826 ถามว่า:
จะเป็นอย่างไรถ้าเรามี a = b = c = 10
นั่นเป็นสถานการณ์เดียวกันกับa = b = c = [1, 2, 3]: คุณมีสามชื่อสำหรับค่าเดียวกัน
แต่ในกรณีนี้ค่าคือ an intและints ไม่เปลี่ยนรูป ในทั้งสองกรณีคุณสามารถ rebind aเป็นค่าที่แตกต่างกัน (เช่นa = "Now I'm a string!") แต่จะไม่ส่งผลกระทบต่อค่าเดิมซึ่งbและcจะยังคงเป็นชื่อ ความแตกต่างคือมีรายการคุณสามารถเปลี่ยนค่า[1, 2, 3]ลงไป[1, 2, 3, 4]ด้วยการทำเช่นa.append(4); ตั้งแต่ที่จริงการเปลี่ยนแปลงค่าที่bและcเป็นชื่อสำหรับตอนนี้จะขb [1, 2, 3, 4]ไม่มีทางเปลี่ยนมูลค่า10เป็นอย่างอื่นได้ 10คือ 10 ตลอดไปเช่นเดียวกับ Claudia ที่แวมไพร์คือ 5 ตลอดไป (อย่างน้อยก็จนกว่าเธอจะถูกแทนที่ด้วย Kirsten Dunst)
* คำเตือน: อย่าให้ Notorious BIG เป็นฮอทดอก ไม่ควรให้อาหารซอมบี้ Gangsta แร็พหลังเที่ยงคืน
a,bและc,ไปยังจุดทั้งหมดเป็นค่าเดียวกัน (ในกรณีนี้รายการ) หรือไม่หรือคุณต้องการa=0, และb=3c=5ในกรณีที่คุณต้องการหรือเพียงแค่a,b,c = [0,3,5]a,b,c = 0,3,5