类变量就是供类使用的变量,实例变量就是供实例使用的
class Person:
name="aaa"
p1=Person()
p2=Person()
p1.name="bbb"
print p1.name # bbb
print p2.name # aaa
print Person.name # aaa
这里p1.name="bbb"是实例调用了类变量,这其实和上面第一个问题一样,就是函数传参的问题,p1.name一开始是指向的类变量name="aaa",但是在实例的作用域里把类变量的引用改变了,就变成了一个实例变量,self.name不再引用Person的类变量name了.
可以看看下面的例子:
class Person:
name=[]
p1=Person()
p2=Person()
p1.name.append(1)
print p1.name # [1]
print p2.name # [1]
print Person.name # [1]
这个知识你get了吗?
先看代码:
1
2
3
4
|
a
=
1
def
fun
(
a
)
:
a
=
2
print
a
#1
|
################
1
2
3
4
|
b
=
[
]
def
fun
(
b
)
:
b
.
append
(
1
)
print
b
#1
|
上面两个分别输出的到底应该是哪一个呢?
这里首先需要弄清楚的就是可变(mutable)对象与不可变对象(immutable),在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象,当一个引用传递给函数的时候,函数自动复制一份引用,所以第一个不可变对象对于a值的引用和外面a= 1没有半毛线关系,而下面的应用则是指向对象本身的引用,那么输出的值自然就是1了,这个知识点你get了吗?