[英]Values of instance variables of superclass persist across instances of subclass
我不確定這是否是我對Python中OOP工作方式的基本誤解,但我看到了一些非常奇怪的行為。 這是一段代碼片段:
class Foo(object):
def __init__(self, l = []):
print "Foo1:", l
self.mylist = l
print "Foo2:", self.mylist
class Bar(Foo):
def __init__(self, label=None):
self.label = label
super(Bar, self).__init__()
print "Bar:", self.mylist
bar1 = Bar()
bar1.mylist.append(4)
bar2 = Bar()
print "bar2's list:", bar2.mylist
我希望當構造bar2
時,它的mylist
實例變量將被設置為空列表。 但是,當我在Python 2.6.6中運行此程序時,我得到以下輸出:
Foo1: []
Foo2: []
Bar: []
Foo1: [4]
Foo2: [4]
Bar: [4]
bar2's list: [4]
看起來Foo的mylist實例變量被保存在Bar類的多個實例中,但我不知道為什么會這樣。 你們可以給我的任何幫助將不勝感激。
問題是默認參數在模塊初始化時綁定,而不是在函數調用時綁定,因此只有一個默認列表作為該函數的所有調用的默認值共享。
你真正想做的是:
def __init__(self, l=None):
if l is None:
l = []
self.mylist = l
在Python教程中獲取默認參數值的戰利品它說:
重要警告:默認值僅評估一次。 當默認值是可變對象(如列表,字典或大多數類的實例)時,這會有所不同。
或者,以下函數累積在后續調用中傳遞給它的參數:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
這將打印
[1]
[1, 2]
[1, 2, 3]
如果您不希望在后續調用之間共享默認值,則可以編寫如下函數:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.