หากคุณมาที่ 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
และint
s ไม่เปลี่ยนรูป ในทั้งสองกรณีคุณสามารถ 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=3
c=5
ในกรณีที่คุณต้องการหรือเพียงแค่a,b,c = [0,3,5]
a,b,c = 0,3,5