פורסם 2014 בפברואר 2511 שנים שלום.כאשר אני יוצר מחלקה ובתוכה הגדרתי init עם מילון ריקאז כאשר אני יוצר 2 מופעים חדשים ,אני מצפה שמילון 1 ישאר כמו שהוא, ומילון 2 יהיה משהו בנפרד,אך הוא מערבב מילון 1, עם מילון של 2 (ואפילו דורס את הקיים )...דרישות: mutable. איפה הבעייה ?https://www.dropbox.com/s/v705ft1qqbg0rw4/vec.py
פורסם 2014 בפברואר 2511 שנים ב-init הגדרת את הפרמטר עם הערך הדיפולטי {}=dic. הקומפיילר לא יוצר את הערך הדיפולטי כל פעם שאתה קורא לפונקציה, אלא רק פעם אחת ברגע שהגדרת אותה. כל פעם שאתה קורא ל-init בלי פרמטר, הוא שם ב-dic את המילון הזה, ככה שלכל האובייקטים שנוצרים כך יש את אותו מילון.אתה יכול לעשות משהו כזה במקום:def __init__(self,dic=None): if dic is None: dic = {} self.dic = dic נערך 2014 בפברואר 2511 שנים על-ידי שניצל
פורסם 2014 בפברואר 2511 שנים אויש. אני זוכר כשנפלתי על זה בפעם הראשונה. חשבתי שאני יוצא מדעתי... למען הבהירות, זה נכון לכל פונקציה ולכל פרמטר דיפולטי, לא רק init. וכל טיפוס mutable, לא רק מילון (לדוגמא רשימה ריקה [] ).
פורסם 2014 בפברואר 2511 שנים מחבר יש, סוף סוף.... זה עובד כמו גדול..ממש עזרת לי להבין , ולהצליח...וגם תודה ל ZELLIG על חידוד בעניין הפונקציות וכו'.. נערך 2014 בפברואר 2511 שנים על-ידי MACHINE-GUN
פורסם 2014 בפברואר 2511 שנים if dic is None מתפרש בקלות גם כ:if not dicובהתאם if dic בודק אם הוא לא ריק.
פורסם 2014 בפברואר 2711 שנים זהירות, כי if not dlc יעבוד גם על מילון ריק, מה שעלול להחליף את המליון בצורה שתפתיע את המשתמש:class X: def __init__(self, adict=None): if not adict: adict = {} self.adict = adictx1 = X(mydict)# obviousy x1.adict is a new emtpy dict, as expectedmydict = {1:'one'}x2 = X(mydict)# as expected, x2.adict is mydict, therefore it contains has key 1 with value 'one'mydict = {}x3 = X(mydict)mydict[1] = 'one'# OOPS! x3.adict is NOT mydict! x3.adict is still empty!אם תשתמש ב- if mydict is None אז הדוגמא השלישית תעבוד נכון נערך 2014 בפברואר 2711 שנים על-ידי Zelig
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.