python中处理类和对象变量时字符串和数字的不同行为

python中处理类和对象变量时字符串和数字的不同行为,python,class,variables,object,Python,Class,Variables,Object,我发现一个问题,无法理解差异的原因: 代码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的概念) 代码2: class Test: var=[] def __init__(s

我发现一个问题,无法理解差异的原因:

代码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的概念)

代码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']
我在Stack Exchange中阅读了关于code2的文章:


但无法将code1与以下概念联系起来。请帮助

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

在代码2中,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']

这说明问题了吗?

这与“字符串和数字”无关。在第一段代码中,您有一个整数,可以替换它;在第二个列表中,您有一个调用
append
的列表。这些操作本质上是不同的,所以它们有不同的效果并不奇怪,当然?我想他很好奇为什么
q.var
是3而不是4。谢谢Daniel,我有一个困惑,为什么第一种情况下输出不是3和4,或者类变量在第一种情况下没有更新,但在第二种情况下更新了?@wilbur这就是我需要知道的..谢谢你..区别不仅仅在于数据类型是否可变。如果列表示例执行了
self.var=self.var+['fool']
,那么它的行为将与第一个示例相同。另外,正确的解释应该包括第一个示例如何创建隐藏类属性的实例属性。感谢@user2357112的回复,您能再解释一下吗?
p.var1: ['fool']
q.var2: ['fool', 'fool']
p.var2: ['fool', 'fool']