سؤال

لماذا يفعل ما يلي:

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

a1 = A()
a1._var.append('one')

a2 = A()

والنتيجة في:

var = [] 182897439952
var = ['one'] 182897439952

وأنا لا أفهم لماذا لا يستخدم مثيل جديد من قائمة عند استخدام الحجج الكلمة اختياري، يمكن لأحد أن يفسر هذا؟

هل كانت مفيدة؟

المحلول

ويتم إنشاء قائمة فارغة في تعريف الدالة مرة واحدة، في الوقت الذي يتم إنشاء وظيفة في حد ذاته. لم يتم إنشاء في كل مرة يتم استدعاء الدالة.

إذا كنت تريد واحدة جديدة في كل مرة، قيام بذلك:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var

نصائح أخرى

وهذا هو ببساطة خطأ. لا يمكنك (مجد) توفير كائن قابلة للتغيير كقيمة افتراضية في تعريف الدالة.

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

ويجب أن تفعل شيئا من هذا القبيل.

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))
<اقتباس فقرة>   

ويتم إنشاء قائمة فارغة في تعريف الدالة مرة واحدة، في الوقت الذي يتم إنشاء وظيفة في حد ذاته. لم يتم إنشاء في كل مرة يتم استدعاء الدالة.

وبالضبط. كمحاولة للتغلب على هذه تعيين الباحث انه لا يوجد وظيفة على تعريفها والتحقق من وجود لا يوجد في الجسم وظيفة:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top