先放代码:(python2.7.10)
class Res(object):
x = []
def __init__(self, t):
for i in t:
self.x.append(i)
A = Res(['a', 1])
B = Res(['b', 2])
print A.x
print B.x
输出结果是:
['a', 1, 'b', 2]
['a', 1, 'b', 2]
按理说不应该各是各的吗?
改成下面这种形式就好了
def __init__(self, t):
self.x = t
输出:
['a', 1]
['b', 2]
请问这个问题是 list.append() 导致的吗?
黄舟2017-04-17 17:54:36
這個地方應該看下基礎教學了
class Res(object):
x = []
def __init__(self, t):
for i in t:
self.x.append(i)
這裡的 x 不是實例變量,而是類別變量,類別變數和實例變數的差異是前者是所有物件共有的,後者是屬於每個實例的。
self.x.append(i)對x解引用時優先解引用成員變量,但你之前未初始化名為x的成員變量,所以最後解引用是類別變數
class Res(object):
x = [1, 2]
def __init__(self, t):
# 直接使用,解引用为成员变量,去掉self.x=3,解引用为类变量
self.x = 3
print self.x
大家讲道理2017-04-17 17:54:36
class Res(object):
def __init__(self,t):
self.x=[]
for i in t:
self.x.append(i)
正如@zwillon 說的, 你的程式碼裡面self.x查找不到實例屬性的時候會使用更上一層的類別屬性。 像上面這樣寫出實例屬性是一個正確的方法。