2016-01-27 48 views
1

我发现一个问题,不能够理解差异的原因:不同的python字符串和数字的行为,当与对象变量

代码1:

class Test: 
    var=2 
    def __init__(self): 
     self.var=self.var+1 

p=Test() 
print "p.var:",p.var 
q=Test() 
print "q.var:",q.var 

输出1:

p.var:3 
q.var:3 

为什么不输出(根据概念用来解释码2)

p.var:3 
q.var:4 

代码2:

class Test: 
    var=[] 
    def __init__(self): 
     self.var.append("fool") 

p=Test() 
print "p.var:",p.var 
q=Test() 
print "q.var:",q.var 

输出2:

p.var: ['fool'] 
q.var: ['fool', 'fool'] 

我读堆栈交易所CODE2的文章: python class instance variables and class variables

,但无法与以下concept.Please链接代码1帮助

+0

这与“字符串和数字”无关。在第一段代码中,你有一个整数,你替换它;第二,你有一个列表,你在其上调用'append'。这些是根本不同的操作,所以当然不会让你感到惊讶,它们有不同的效果? –

+0

我觉得他很好奇为什么'q.var'是3而不是4. – wpercy

+0

感谢Daniel,我有一个困惑,为什么在第一种情况下输出不是3和4,或者类变量没有在第一种情况下更新但它在第二个? –

回答

0

这里的区别是th在列表中是可变对象;整数是不变的。 当code1递增self.var时,它必须必须返回一个新对象,即3。在第二个调用中,将从2开始,为对象q生成另一个3。

在code2中,var仍然是一个类对象(只有一个用于类,而不是每个对象一个)。当我们创建p时,我们在空列表中追加“傻瓜”。当我们稍后创建q我们追加了第二个“傻瓜”。打印他们两个:

p=Test2() 
print "p.var1:",p.var 
q=Test2() 
print "q.var2:",q.var 
print "p.var2:",p.var 

输出:

p.var1: ['fool'] 
q.var2: ['fool', 'fool'] 
p.var2: ['fool', 'fool'] 

这是否澄清事情?

+1

区别不在于数据类型是否可变。如果列表示例已经完成了'self.var = self.var + ['fool']',那么它的行为将与第一个示例相同。另外,正确解释发生的事情应该真正涵盖第一个示例如何创建隐藏类属性的实例属性。 – user2357112

+0

谢谢@ user2357112您的回复,请您解释一下吗? –

相关问题