มีปัญหาเล็กน้อยที่นี่ซึ่งไม่ครอบคลุมโดยคำตอบอื่น ๆ
ก่อนอื่นให้id
ส่งคืนเท่านั้น:
“ เอกลักษณ์” ของวัตถุ นี่คือเลขจำนวนเต็ม (หรือจำนวนเต็มแบบยาว) ซึ่งรับประกันว่าจะไม่ซ้ำกันและคงที่สำหรับวัตถุนี้ในช่วงชีวิตของมัน วัตถุสองชิ้นที่มีอายุการใช้งานไม่ทับซ้อนกันอาจมีid()
ค่าเท่ากัน
ใน CPython สิ่งนี้เกิดขึ้นเป็นตัวชี้ไปยังPyObject
ที่แสดงถึงวัตถุในล่ามซึ่งเป็นสิ่งเดียวกันกับที่object.__repr__
แสดง แต่นี่เป็นเพียงรายละเอียดการนำไปปฏิบัติของ CPython ไม่ใช่สิ่งที่เป็นจริงของ Python โดยทั่วไป Jython ไม่ได้เกี่ยวข้องกับพอยน์เตอร์มันเกี่ยวข้องกับการอ้างอิง Java (ซึ่งแน่นอนว่า JVM อาจแสดงถึงเป็นพอยน์เตอร์ แต่คุณมองไม่เห็น - และไม่ต้องการเพราะ GC อนุญาตให้ย้ายพวกมันไป) PyPy ช่วยให้ประเภทที่แตกต่างมีประเภทที่แตกต่างกันid
แต่โดยทั่วไปส่วนใหญ่เป็นเพียงดัชนีไปยังสารบัญที่คุณเรียกid
ซึ่งเห็นได้ชัดว่าจะไม่เป็นตัวชี้ ฉันไม่แน่ใจเกี่ยวกับ IronPython แต่ฉันสงสัยว่ามันเป็น Jython มากกว่าเหมือนกับ CPython ในเรื่องนี้ ดังนั้นในการใช้งาน Python ส่วนใหญ่ไม่มีทางที่จะทำให้สิ่งใดปรากฏในนั้นrepr
และไม่มีประโยชน์ถ้าคุณทำ
แต่ถ้าคุณเป็นเพียงแค่สนใจเกี่ยวกับ CPython? นั่นเป็นกรณีที่ค่อนข้างธรรมดาหลังจากทั้งหมด
ก่อนอื่นคุณอาจสังเกตเห็นว่าid
เป็นจำนวนเต็ม; * ถ้าคุณต้องการ0x2aba1c0cf890
สตริงนั้นแทนที่จะเป็นตัวเลข46978822895760
คุณจะต้องจัดรูปแบบด้วยตัวคุณเอง ภายใต้ครอบคลุมผมเชื่อว่าobject.__repr__
ในท้ายที่สุดคือการใช้printf
ของ%p
รูปแบบที่คุณไม่ได้จากงูใหญ่ ... แต่คุณสามารถทำสิ่งนี้:
format(id(spam), '#010x' if sys.maxsize.bit_length() <= 32 else '#18x')
* ใน 3.x int
ก็เป็น ใน 2.x มันเป็นเรื่องint
ที่ใหญ่พอที่จะถือตัวชี้ซึ่งอาจไม่ใช่เพราะปัญหาหมายเลขที่ลงนามในบางแพลตฟอร์มและlong
อย่างอื่น
มีอะไรที่คุณสามารถทำได้กับพอยน์เตอร์เหล่านี้นอกเหนือจากพิมพ์ออกมา? แน่นอน (อีกครั้งสมมติว่าคุณให้ความสำคัญกับ CPython เท่านั้น)
ทั้งหมดของC APIฟังก์ชั่นใช้ตัวชี้ไปที่PyObject
หรือประเภทที่เกี่ยวข้อง สำหรับประเภทที่เกี่ยวข้องเหล่านั้นคุณก็สามารถโทรPyFoo_Check
เพื่อให้แน่ใจว่าจริงๆมันเป็นวัตถุโยนแล้วด้วยFoo
(PyFoo *)p
ดังนั้นหากคุณกำลังเขียนส่วนขยาย C id
สิ่งที่คุณต้องการก็คือ
ถ้าคุณกำลังเขียนโค้ด Python แท้ คุณสามารถเรียกฟังก์ชั่นเดียวกันกับจากpythonapi
ctypes
สุดท้ายไม่กี่คำตอบอื่น ๆ ctypes.addressof
ได้นำขึ้นมา ไม่เกี่ยวข้องที่นี่ ใช้งานได้เฉพาะกับctypes
วัตถุเช่นc_int32
(และอาจเป็นวัตถุคล้ายบัฟเฟอร์หน่วยความจำบางอย่างเช่นที่จัดทำโดยnumpy
) และถึงตรงนั้นมันไม่ได้ให้ที่อยู่ของc_int32
คุณค่ากับคุณ แต่ให้ที่อยู่ของ C-level int32
ที่c_int32
ล้อมรอบ
ที่ถูกกล่าวบ่อยกว่าถ้าคุณคิดว่าคุณต้องการที่อยู่ของบางสิ่งบางอย่างคุณไม่ต้องการวัตถุหลามพื้นเมืองในตอนแรกคุณต้องการctypes
วัตถุ