עברו ע'י הפניה מול ערך בפייתון

Pass Reference Vs



לאחר הכרת פייתון, תוכל למצוא מקרים בהם הפונקציות אינן משנות את הטיעונים במקום כפי שהיית מצפה, במיוחד אם אתה מכיר שפות מחשב רבות אחרות. שפות רבות משתמשות בארגומנטים של שיטות כהפניות, המוגדרות כמעבר על ידי הפניה למשתנים הנוכחיים. אם אתה מפתח מתקדם של פייתון שרוצה להבין את הדרך המיוחדת של פייתון לטפל בטיעוני שיטה, אז המדריך הזה הוא באמת בשבילך.

Python תומך בהתייחסות לאובייקט

ערך עובר-לפי-ערך ושווי-ערך הם ללא ספק שתי הדרכים המוכרות והקלות ביותר להבנה של פרמטרים בין שפות תכנות. Python הוא, למרבה הצער, 'הפניה-עובר-אובייקט-התייחסות', לא מעבר לפי ערך או מעבר על-ידי הפניה, המכונה לעתים קרובות התייחסות לאובייקט, כמו גם שיחה על-ידי שיתוף. כדאי להסתכל מקרוב על הרעיון עצמו על ידי פיצולו למקטעים בזמן שאתה צולל לפרטים הטכניים של מעבר ליד הפניה:







לַעֲבוֹר: זה אומר לספק שיטה עם טיעון.



לפי הפניה: המשמעות היא שהטיעון שאתה מעביר לשיטה מתייחס למשתנה שנמצא כעת באחסון במקום העתק אחר של המשתנה.



כאשר אתה מקצה לשיטה התייחסות למשתנה מוגדר, המשתנה שאליו הוא תואם יושפע במפורש מכל הפעולות בהתייחסות זו. כעת הבה נבחן דוגמא כיצד, בפועל, הדבר פועל. בדוגמה זו הגדרנו משתנה ' כּוֹעֵס' בעל ערך של 4 . לאורך תרחיש זה, המשתנה ' כּוֹעֵס' לא השתנה במקומה. נראה כי פייתון מתמודד עם הטיעון שסופק במקום התייחסות למשתנה הנוכחי כערך עצמאי.





האם זה אומר שבמקום על ידי הפניה, פייתון מעביר ארגומנטים לפי ערך? Python מעביר ארגומנטים באמצעות הקצאה, כך שלא לפי הפניה ולא עם ערך. ההיגיון לכך הוא כפול:



נכון לעכשיו, הפרמטר העובר הוא מצביע לאובייקט. סוגים מסוימים של נתונים ניתנים לשינוי, וחלקם אינם ניתנים לשינוי.

אם נעביר אובייקט הניתן לשינוי לפונקציה, הפונקציה רוכשת התייחסות לאותו אובייקט ממש כך שתוכל לשנות את כל זה לשביעות רצון נשמתך; עם זאת, ההיקף החיצוני לא יידע דבר לפני שתצטרף מחדש לרפרנס בפונקציה. לאחר שתסיים, ההפניה החיצונית תכוון רק לאובייקט האמיתי. אם אתה מעביר אובייקט בלתי משתנה לפונקציה, לא תמיד ניתן לחבר מחדש את הפניה החיצונית, ואי אפשר פשוט לשנות את האובייקט. כדי להפוך את הדברים לפשוטים בהרבה, בואו נבין אחד אחד.

עברו לפי הפניה

קודם כל, עליך להבין שהמשתנה 'mylist' עצמו אינו רשימה אלא מתייחס לרשימה בעלת ערכים. אתה יכול לקרוא למשתנה 'mylist' לכלי שיש בו ערכים. ערכי הרשימה הם אובייקטים. המשתנה 'mylist' נמסר ישירות לפונקציה עם תוכנו.

נראה כי שני הרשימה והרשימה שלי הם אותו משתנה אחסון בדוגמת הקוד להלן ולכן חלים על אותו אובייקט אחסון ממש. לכן על הפלט, הוא מדפיס 'Saeed'.

כל פעולה שתעשה על המשתנה או הישות תשתקף באופן מיידי לשיטת המתקשר. השיטה עשויה לשנות לחלוטין את ערך המשתנה ולכוון אותה לאובייקט מובהק לחלוטין. כפי שאתה יכול לראות בפונקציה 'set_list', שינינו את תוכן הרשימה והדפסנו רשימה חדשה לגמרי עם האלמנט 'Aqsa.'

השיטה עשויה גם להקצות מחדש את רכיבי המשתנה לאותה תוצאה שלהלן. אתה יכול לראות שהוספנו ערך חדש לרשימה, והשינוי בא לידי ביטוי. צירפנו מחרוזת ייחודית לרשימה והחזרנו אותה למתקשר. לסיום, השיטה והמתקשר השתמשו באותו משתנה ואובייקט לאורך יחסי המעבר.

עברו לפי ערך

דרך מעבר לפי ערך, השיטה מסופקת עם עותק של אובייקט הארגומנט שהמתקשר מקצה לו. זה מבטיח שהפריט המקורי יישאר ללא שינוי וכל השינויים שבוצעו נשמרים במיקומי זיכרון נפרדים בהעתק של אותו אובייקט.

הוא תקף במידה שווה לכל פעולות המבוצעות על משתנה או על הישות בשיטה. כפילויות של משתנים ואובייקטים בהיקף שיטת המתקשרים מופרדים לחלוטין כדי לסכם אותם.

העבר אובייקט לפי הפניה

לאורך כל המצב הזה, מכיוון שפייתון מובחן, השיטות של פייתון משיגות את הפניה האובייקט הדומה מאוד לאחסון כפי שהמתקשר מתייחס אליו. מנגד, הטכניקה לא משיגה את המשתנה 'mylist' (המיכל). שיטת המתקשר מאחסן את אותו אובייקט; השיטה מייצרת מיכל של אחד ויוצרת אינדקס טרי לגמרי משלה, בדיוק כמו בערך עובר-ערך.

המתקשר והשיטה מדברים על אותו אובייקט באחסון, אך כאשר השיטה המצורפת מחילה פריט חיצוני לרשימה, ישות המתקשר משתנה. יש להם מספר תוויות, אבל הם אותם דברים. שני המשתנים מחזיקים אובייקט דומה מאוד. זוהי התחושה מאחורי היחס שלה לנוע על ידי האובייקט. באחסון, השיטה והמתקשר משתמשים באובייקט דומה ובכל זאת תופסים אותם דרך משתנים מרובים. משתנה המתקשר (הקונטיינר) לא ישתנה על ידי שינויים שנעשו במשתנה השיטה (המיכל); רק הנתונים או התוכן משתנים.

סיכום

Python פועל באופן עצמאי משפות המקבלות את הנע לפי התייחסות או ערך של ארגומנטים. ארגומנטים לשיטה הם משתנים מקומיים שהוקצו לכל ערך שהועבר לשיטה. אבל זה עדיין לא מונע ממך להשיג את אותן התוצאות שהיית מוצא בשפות אחרות תוך העברת טיעונים באמצעות פרוקסי.