python两个实例类之间会有干扰吗?
就如下述代码所示,我新建两个类,修改其中一个,为什么list a就受到了test1的影响,而int
b却没有收到影响???
class test : a = []
b = 0
def main():
#实例化两个类,两个之间没有关系。
test1 =test()
test2 =test()
#这里我只对test1进行了操作
test1.a.append('123')
test1.b =567
#期望这里的test2应该是没有[]和0
print(test2.a)
print(test2.b)
if __name__ == "__main__":
main()
这是什么原因???我看了基础语法教程也没说到这块有什么特殊的地方啊?
回答:
这里涉及两个 Python 知识点:
- 类级共享属性
- 容器
这样的写法,属性是类级共享的:
python">class Spam:
foo = []
bar = 11
字典、列表等是容器类型;添加或删除元素操作,是操作容器内的元素
>>> egg = []
>>> hex(id(egg))
'0x1050d3cc0'
>>> egg.extend([4, 5, 6])
>>> egg
[4, 5, 6]
>>> hex(id(egg))
'0x1050d3cc0'
>>>
>>> egg = [4, 5, 6]
>>> egg
[4, 5, 6]
>>> hex(id(egg))
'0x10514f280'
这两点合在一起就是你描述的问题。
关于类级共享属性,当实例化一个类之后,这个实例还是和类使用共享的属性:
>>> class Spam:... foo = []
... bar = 11
...
>>> hex(id(Spam.foo))
'0x1050ada80'
>>> s = Spam()
>>> hex(id(s.foo))
'0x1050ada80'
只有当实例对属性赋值之后,这个属性的作用范围就只在这个实例内部(相当于在实例内重新创建了一个该属性)。
>>> s.foo is Spam.fooTrue
>>> s.foo = [1, 2, 3]
>>> hex(id(s.foo))
'0x105111200'
>>> s.foo is Spam.foo
False
回答:
这真是python特色问题了,搜一下“python 可变对象”。
简单来说,列表字典等属于可变对象,当他们作为函数参数/类变量时,如果发生改写,是不会生成新对象的。而int等不可改写对象正好相反。
以上是 python两个实例类之间会有干扰吗? 的全部内容, 来源链接: utcz.com/a/164799.html