ผ่านการอ้างอิงเทียบกับค่าใน Python

Pass Reference Vs



หลังจากรู้จัก Python แล้ว คุณจะพบกรณีที่ฟังก์ชันไม่เปลี่ยนแปลงอาร์กิวเมนต์ในจุดที่คุณคาดหวัง โดยเฉพาะอย่างยิ่งหากคุณคุ้นเคยกับภาษาคอมพิวเตอร์อื่นๆ มากมาย หลายภาษาใช้อาร์กิวเมนต์ของเมธอดเป็นข้อมูลอ้างอิง ซึ่งกำหนดโดยการอ้างอิงไปยังตัวแปรปัจจุบัน หากคุณเป็นนักพัฒนา Python ขั้นสูงที่ต้องการเข้าใจวิธีการเฉพาะของ Python ในการจัดการข้อโต้แย้งของเมธอด คู่มือนี้เหมาะสำหรับคุณจริงๆ

Python รองรับ Pass by Object Reference

การส่งผ่านโดยการอ้างอิงและการส่งผ่านค่าเป็นสองวิธีที่ได้รับการยอมรับและเข้าใจได้ง่ายที่สุดในการส่งผ่านพารามิเตอร์ระหว่างภาษาโปรแกรมมิงอย่างปฏิเสธไม่ได้ น่าเศร้าที่ Python 'pass-by-object-reference' ไม่ใช่ Pass by Value หรือ Pass by Reference ซึ่งมักเรียกว่า Call by Object Reference และ Call by Sharing มีประโยชน์ในการดูแนวคิดให้ละเอียดยิ่งขึ้นด้วยการแยกเป็นส่วนๆ ขณะที่คุณเจาะลึกข้อมูลเฉพาะทางเทคนิคของการอ้างอิง:







ผ่าน: นี่หมายถึงการจัดหาวิธีการที่มีการโต้แย้ง



โดยอ้างอิง: นี่หมายความว่าอาร์กิวเมนต์ที่คุณย้ายไปยังเมธอดนั้นหมายถึงตัวแปรที่อยู่ในที่เก็บข้อมูลแทนการจำลองแบบอื่นของตัวแปรนั้น



เมื่อคุณกำหนดวิธีการอ้างอิงให้กับตัวแปรที่กำหนดไว้ ตัวแปรที่สัมพันธ์กันจะได้รับอิทธิพลอย่างชัดเจนจากการดำเนินการทั้งหมดในข้อมูลอ้างอิงนี้ ตอนนี้ให้เราพิจารณาตัวอย่างวิธีการทำงานนี้ ในตัวอย่างนี้ เราได้กำหนดตัวแปร ' โกรธ' มีค่าของ 4 . ตลอดสถานการณ์นี้ ตัวแปร ' โกรธ' ไม่ได้ถูกดัดแปลงแทนที่ ดูเหมือนว่า Python จะจัดการกับอาร์กิวเมนต์ที่คุณให้ไว้แทนที่จะอ้างอิงถึงตัวแปรปัจจุบันเป็นค่าที่มีอยู่ในตัวเอง





นี่หมายความว่าแทนที่จะใช้การอ้างอิง Python จะย้ายอาร์กิวเมนต์ตามค่าหรือไม่ Python จะย้ายอาร์กิวเมนต์ผ่านการมอบหมาย ดังนั้นไม่ว่าจะโดยการอ้างอิงหรือด้วยค่า ตรรกะสำหรับสิ่งนี้เป็นสองเท่า:



ปัจจุบัน พารามิเตอร์ที่ส่งผ่านเป็นตัวชี้ไปยังวัตถุ ข้อมูลบางประเภทสามารถเปลี่ยนแปลงได้ และบางประเภทไม่สามารถเปลี่ยนแปลงได้

ถ้าเราย้ายออบเจกต์ที่เปลี่ยนแปลงได้ไปเป็นฟังก์ชัน ฟังก์ชันนั้นจะได้รับการอ้างอิงถึงออบเจกต์เดียวกัน ดังนั้นคุณจึงสามารถกลายพันธุ์ได้ทั้งหมดตามความพึงพอใจของจิตวิญญาณของคุณ อย่างไรก็ตาม ขอบเขตภายนอกจะไม่รู้อะไรเลยก่อนที่คุณจะเข้าร่วมการอ้างอิงในฟังก์ชันอีกครั้ง เมื่อคุณทำเสร็จแล้ว การอ้างอิงภายนอกจะมุ่งไปที่วัตถุจริงเท่านั้น หากคุณย้ายออบเจ็กต์ที่ไม่เปลี่ยนรูปไปยังฟังก์ชัน การอ้างอิงภายนอกจะไม่สามารถผูกมัดใหม่ได้เสมอ และคุณไม่สามารถเปลี่ยนเฉพาะออบเจกต์ได้ เพื่อให้สิ่งต่าง ๆ ตรงไปตรงมามากขึ้น มาทำความเข้าใจทีละคน

ผ่านโดยอ้างอิง

ก่อนอื่น คุณต้องเข้าใจว่าตัวแปร 'mylist' ไม่ใช่รายการ แต่หมายถึงรายการที่มีค่า คุณสามารถเรียกตัวแปร 'mylist' ว่าคอนเทนเนอร์ที่มีค่าอยู่ภายใน รายการค่าเป็นวัตถุ ตัวแปร 'mylist' ถูกส่งตรงไปยังฟังก์ชันพร้อมเนื้อหา

ทั้ง list & my list ดูเหมือนจะเป็นตัวแปรหน่วยเก็บข้อมูลเดียวกันในตัวอย่างโค้ดด้านล่าง ดังนั้นจึงใช้กับวัตถุหน่วยเก็บข้อมูลเดียวกัน นั่นเป็นสาเหตุว่าทำไมบนเอาต์พุตจึงพิมพ์ 'Saeed'

การดำเนินการใดๆ ที่ทำกับตัวแปรหรือเอนทิตีจะถูกมิเรอร์ไปยังเมธอดของผู้โทรทันที วิธีการนี้อาจปรับเปลี่ยนค่าของตัวแปรทั้งหมดและมุ่งไปที่วัตถุที่แตกต่างกันโดยสิ้นเชิง ดังที่คุณเห็นในฟังก์ชัน 'set_list' เราได้เปลี่ยนเนื้อหาของรายการและพิมพ์รายการใหม่ทั้งหมดที่มีองค์ประกอบ 'Aqsa' เนื่องจากเราได้ส่งคืนรายการที่แก้ไขแล้วและพิมพ์ในบรรทัดเดียวกับผู้โทร

วิธีนี้อาจจัดสรรองค์ประกอบของตัวแปรใหม่เพื่อให้ได้ผลลัพธ์เช่นเดียวกับด้านล่าง คุณจะเห็นว่าเราได้เพิ่มค่าใหม่ลงในรายการแล้ว และการเปลี่ยนแปลงก็มีผล เราได้เพิ่มสตริงที่ไม่ซ้ำในรายการและส่งคืนให้กับผู้โทร โดยสรุป เมธอดและผู้เรียกใช้ตัวแปรและอ็อบเจ็กต์เดียวกันตลอดความสัมพันธ์แบบส่งผ่าน

ผ่านความคุ้มค่า

โดยผ่านค่า วิธีการจะมาพร้อมกับวัตถุอาร์กิวเมนต์ที่ซ้ำกันที่ผู้เรียกกำหนดให้กับมัน เพื่อให้แน่ใจว่ารายการต้นฉบับยังคงไม่เปลี่ยนแปลง และการแก้ไขทั้งหมดที่ทำไว้จะถูกเก็บไว้ในตำแหน่งหน่วยความจำที่แยกจากกันในแบบจำลองของวัตถุเดียวกัน

มันใช้ได้เท่าเทียมกันกับการดำเนินการใด ๆ ที่ดำเนินการกับตัวแปรหรือเอนทิตีโดยวิธีการ ตัวแปรและอ็อบเจ็กต์ที่ซ้ำกันในขอบเขตของเมธอดผู้โทรจะถูกแยกออกทั้งหมดเพื่อสรุป

ส่งผ่านวัตถุโดยอ้างอิง

ตลอดสถานการณ์นี้ เนื่องจาก Python มีความแตกต่างกัน วิธีการของ Python จึงได้รับการอ้างอิงวัตถุที่คล้ายกันมากในการจัดเก็บตามที่ผู้เรียกอ้างถึง ในทางกลับกัน เทคนิคไม่ได้รับตัวแปร 'mylist' (คอนเทนเนอร์) วิธีการโทรเก็บวัตถุเดียวกัน วิธีการสร้างคอนเทนเนอร์ของตัวเองและสร้างดัชนีใหม่ทั้งหมดสำหรับตัวมันเอง เช่นเดียวกับในการส่งผ่านค่า

ผู้เรียกและเมธอดพูดถึงอ็อบเจ็กต์เดียวกันในที่เก็บข้อมูล แต่เมื่อเมธอดที่ผนวกใช้รายการภายนอกกับรายการ เอนทิตีผู้โทรจะถูกแก้ไข มีป้ายกำกับหลายรายการ แต่เป็นสิ่งเดียวกัน ตัวแปรทั้งสองมีวัตถุที่คล้ายกันมาก นั่นคือความรู้สึกเบื้องหลังความสัมพันธ์กับการเคลื่อนที่ของวัตถุ ในการจัดเก็บ เมธอดและผู้เรียกใช้อ็อบเจ็กต์ที่คล้ายกันแต่จับได้ผ่านตัวแปรหลายตัว ตัวแปรผู้เรียก (คอนเทนเนอร์) จะไม่ถูกเปลี่ยนแปลงโดยการแก้ไขใดๆ ที่ทำกับตัวแปรเมธอด (คอนเทนเนอร์) เฉพาะข้อมูลหรือเนื้อหาที่ได้รับการแก้ไข

บทสรุป

Python ทำงานเป็นอิสระจากภาษาที่ยอมรับการย้ายโดยการอ้างอิงหรือค่าของอาร์กิวเมนต์ อาร์กิวเมนต์ของเมธอดคือตัวแปรโลคัลที่ได้รับการจัดสรรให้กับแต่ละค่าที่โอนไปยังเมธอด แต่นั่นก็ไม่ได้กีดกันคุณจากการได้รับผลลัพธ์แบบเดียวกับที่คุณพบในภาษาอื่นในขณะที่ย้ายข้อโต้แย้งด้วยพร็อกซี