Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תיכנות בלינוקס - כיצד מעבירים מצביע ל-set לפונקציה?

COM64 - 25/05/2021 - 07:59
נושא ההודעה: כיצד מעבירים מצביע ל-set לפונקציה?
אני מנסה להריץ פונקציה מסויימת במקביל כשבתוך כל instance שלה היא צריכה לעדכן set שמשותף לכל הפונקציות שרצות.

משהו בסגנון הזה:
קוד:
def extend_set(myset):
    myset = myset.union(myset, {"abc"})
    print("myset in the function: ", myset)
   
myset = {"xyz"}
print(extend_set(myset))


בתוך הפונקציה זה כמובן עובד ומחוץ לפונקציה ה-set נמחק לחלוטין:

קוד:

myset in the function:  {'abc', 'xyz'}
None


מה הדרך להעביר את הסט כ-pointer לפונקציה או דרך אלגנטית יותר לבצע את זה?

תודה !
Anonymous - 25/05/2021 - 08:11
נושא ההודעה:
זה כבר עבר כרפרנס (ולא מצביע) רק שדרסת אותו.
COM64 - 25/05/2021 - 08:39
נושא ההודעה:
Anonymous :
זה כבר עבר כרפרנס (ולא מצביע) רק שדרסת אותו.


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

כשאתה אומר שדרסתי אותו, באיזו נקודה זה קורה? ה-print אחרי ה-union מדפיס את הסט המקורי והערך הנוסף.

תודה !
mksoft - 25/05/2021 - 09:52
נושא ההודעה:
כדאי לשים לב שה-print החיצוני שלך מדפיס את מה שהפונקציה מחזירה, ובמקרה הנ"ל היא באמת מחזירה None.
mksoft - 25/05/2021 - 10:34
נושא ההודעה:
כמו כן:
בפונקציה שכתבת, אתה לא משנה את myset עצמו, אתה מגדיר myset חדש שזה מה ש-union עושה(אפשר להדפיס את ה-id שלהם), לכן מחזירים מהפונקציה את ה-myset החדש, או שמשנים אותו inplace (עם add או update).

דוגמה:
קוד:

In [18]: def extend_set(myset):
    ...:     myset.update({"abc"})
    ...:     print("myset in the function: ", myset)
    ...:

In [19]: myset = {"xyz"}

In [20]: extend_set(myset)
myset in the function:  {'abc', 'xyz'}

In [21]: print(myset)
{'abc', 'xyz'}


COM64 - 26/05/2021 - 15:22
נושא ההודעה:
תודה !

ואשמח להסבר קצר על ההבדל בין שליחת מצביע לעומת רפרנס?
Anonymous - 26/05/2021 - 17:45
נושא ההודעה:
COM64 :
תודה !

ואשמח להסבר קצר על ההבדל בין שליחת מצביע לעומת רפרנס?


רפרנס הוא מצביע קבוע לערך שיכול להשתנות
queency - 12/06/2021 - 22:30
נושא ההודעה:
בעיקרון בפייתון ככול הידוע לי הכל מצביעים .

הרפרנס הוא כתובת הערך או כתובת המערך או כתובת הקלאס

נגיד בכתובת 00010 מתחיל קלאס מסוים אז הרפרנס יהיה 00010
אם אתה מעביר רפרנס בעצם אתה מעביר את הכתובת 00010

המצביע לעומת זאת שוכן בכתובת אחרת נגיד 00090
ואם תסתכל על התוכן שלו אז תראה את התוכן 00010

יכול להיות מצביע ששוכן בכתובת 00130 והוא מצביע לכתובת 00090
אבל גם הכתובת 00090 התוכן שלה הוא 00010 והתוכן שלו הוא הקלאס.

נראה לי שאתה מתבלבל עם BY VALUE הנהוג בדרך כלל ב C C++
כאשר BY VALUE אתה בעצם מעביר את כל תוכן הערך או את המערך
או את הקלאס .
כל הזמנים הם GMT + 2 שעות