簡體   English   中英

超類的實例變量的值在子類的實例之間持久存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM