学python千万别想当然

来源:互联网 发布:原油软件 编辑:程序博客网 时间:2024/04/28 21:27

学语言千万别想当然。对于python语言,如果当做c++或者c#来学,是很危险的一件事。

比如


class student():

pass

a = student

b = student()

 

如果按照c++的理解,两者可以理解为a = new student, b = new student(),那么两个的含义是一样的。但对于python,这两个的含义是完全不同的。


由于python中所有的类都是对象,包括object类,int类,str类,统统都是对象。因此,a表示student对象的引用,注意,不是student生成的对象的引用,a就是student。甚至可以写c =a(),等价于c=student()。


而第二种形式b=student()表示b为student生成的对象的引用。如果非要测试,可以这样


class student():

    pass

a = student

b = student()

print(type(a))

print(type(b))

 

type(a)为<class 'type'>,而type(b)为<class '__main__.student'>。可见,a就是student。如果明白了这些,可以在测试一道题目:


class student():

    pass

a = student

b = student()

a.name = 'aaa'

c = student()

print(b.name)

print(c.name)


结果应该都是aaa,而不应该报错。为什么,因为python的类为动态的,不是静态的哦。改变了a就是改变了student,当然就改变了b,c。b,c是student的对象的引用嘛。

但可能有同学有疑问:c我可以理解,为什么b也会改变,b生成的时候,student还没有name成员呢。

问题很好,我当时也不明白,使得我不得不阅读了一下python的源码。简单说来,就是python的所有类都是对象。什么意思?简单画个图。实际上,a,b,c的关系是这样的:


当然,实际的关系要复杂的多,只是简单表示了一下,a,b,c,student的关系。可以看到,实际上b是指向student对象的,所以,无论什么时候,只要student发生了变化,那么b就可以看到。

 

Ps:本人python菜鸟,正在苦学python,写此文只是给遇到同样问题的人提醒一下,认识比较粗浅,请大牛们莫拍。

0 0
原创粉丝点击