[英]Initialisation of keyword args in Python
為什么執行以下操作:
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))
函數定義中的空列表在創建函數本身時被創建一次。 並非在每次調用函數時都創建它。
究竟。 要變通解決此問題,請在函數定義中分配None並在函數主體中檢查None:
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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.