שני מופעים של מחלקה מתערבבים במילון שלהם ב python - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שני מופעים של מחלקה מתערבבים במילון שלהם ב python


MACHINE-GUN

Recommended Posts

שלום.

כאשר אני יוצר מחלקה ובתוכה הגדרתי init עם מילון ריק

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

דרישות: mutable.

איפה הבעייה ?

https://www.dropbox.com/s/v705ft1qqbg0rw4/vec.py

קישור לתוכן
שתף באתרים אחרים

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

אתה יכול לעשות משהו כזה במקום:

def __init__(self,dic=None):
if dic is None:
dic = {}
self.dic = dic

קישור לתוכן
שתף באתרים אחרים

אויש. אני זוכר כשנפלתי על זה בפעם הראשונה. חשבתי שאני יוצא מדעתי... :s0927:

למען הבהירות, זה נכון לכל פונקציה ולכל פרמטר דיפולטי, לא רק init. וכל טיפוס mutable, לא רק מילון (לדוגמא רשימה ריקה [] ).

קישור לתוכן
שתף באתרים אחרים

זהירות, כי if not dlc יעבוד גם על מילון ריק, מה שעלול להחליף את המליון בצורה שתפתיע את המשתמש:


class X:
def __init__(self, adict=None):
if not adict: adict = {}
self.adict = adict

x1 = X(mydict)
# obviousy x1.adict is a new emtpy dict, as expected

mydict = {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 אז הדוגמא השלישית תעבוד נכון

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...