|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jiangxibian 于 2017-5-7 23:22 编辑
代码如下:
class Test1():
a=[]
def func(self,n):
self.a.append(n)
class Test2():
b=1
结果如下:
>>> a=Test1()
>>> b=Test1()
>>> c=Test2()
>>> d=Test2()
>>> a.func(1)
>>> a.a
[1]
>>> b.a
[1]
>>> c.b=2
>>> d.b
1
>>>
萌新看不懂啊,按照我的理解,a.func(1)修改的不应该是自己的self.a吗,为什么b的值也改了呢
查了一下地址,发现a.a b.a Test1.a都是一样的,所以问题是知道了,但是为什么会这样呢?按照本来的理解
他不应该和下面c d的情况是一样的吗?在哪里理解错了呢?
-----------------------------------------------------------------------------------------------------------------------分割线
来改一下,把问题写的清楚点:
code:
class Test1():
a=[]
b=1
def func(self,n):
self.a.append(n)
运行:
>>> a=Test1()
>>> b=Test1()
>>> a.a
[]
>>> b.a
[]
>>> a.b
1
>>> b.b
1
>>> a.func(1)
>>> a.a
[1]
>>> b.a
[1]
>>> a.b=2
>>> a.b
2
>>> b.b
1
-----------------------------------------------------------------------------------------------------------------------分割线
又有新想法,修改了下代码发现了有趣的事:
class Test1():
a=1
b=1
def func(self,n):
self.a+=1
运行:
>>> a=Test1()
>>> b=Test1()
>>> a.a
1
>>> b.a
1
>>> a.b
1
>>> b.b
1
>>> a.func(1)
>>> a.a
2
>>> b.a
1
值改变了,所以说 是因为列表的原因才导致之前的代码 所有对象的该属性都在同一个地址?有没有大佬能帮忙讲一下具体的原理呢
-----------------------------------------------------------------------------------------------------------------------分割线
补充一下终于让我看懂了的地址吧:https://zhidao.baidu.com/question/2117861326947340307.html 下面那个其他回答
英语不好,F1看文档半天也看不懂
我自己这么理解:
Test1.a是一个类变量,所以代码只要运行起来就会在内存中保存Test1.a = []
然后当你实例化对象的时候,会去复制Test1.a,这里应该是浅拷贝,所以只是把引用给复制了过来
所以当类变量是引用类型的时候,每个实例都会去复制这个类变量的引用,所以每个实例对象中存放的其实是指向同一个引用对象的
你这里就是指向同一个列表
|
|