Initialisation من وسائط رئيسية في بيثون
-
05-07-2019 - |
سؤال
لماذا يفعل ما يلي:
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))
لا تنتمي إلى StackOverflow