
楼主正在自学数据结构.写别的练习时遇到了一点小问题.向大家请教.谢谢啦!
在 Python 中,类成员可以直接访问类属性.比如
class A: a=1 class B(A): b=6 x=B() print(x.a) 会显示
1 对类属性的修改会导致通过类成员访问这一属性时发生改变:
class A: a=1 class B(A): b=6 x=B() print(A.a, x.a, x.a is A.a) A.a = 2 print(A.a,x.a, A.a is x.a) 输出为:
1 1 True 2 2 True 这些我大概还是理解的,但是下面事情变得复杂:
class A: a=1 class B(A): b=6 x=B() print(A.a, x.a, x.a is A.a) A.a = 2 print(A.a,x.a, A.a is x.a) x.a = 0 print(A.a,x.a, x.a is A.a) A.a = 3 print(A.a,x.a, x.a is A.a) A.a = 0 print(A.a, x.a, A.a is x.a) print(2 is 2 ) 输出为:
1 1 True 2 2 True 2 0 False 3 0 False 0 0 True True 以及如果使用可变类型赋值
class A: a=[1] class B(A): b=[6] x=B() print(A.a, x.a, x.a is A.a) A.a = [2] print(A.a,x.a, A.a is x.a) x.a = [0] print(A.a,x.a, x.a is A.a) A.a = [3] print(A.a,x.a, x.a is A.a) A.a = [0] print(A.a, x.a, A.a is x.a) print([2] is [2] ) 会显示:
[1] [1] True [2] [2] True [2] [0] False [3] [0] False [0] [0] False False 我的问题:
1.为什么会产生这种区别?
2.用代码
x.a = 0 和
x.a = [0] 改变类成员属性时发生了什么呢?为什么不会改变类属性 A.a 呢?
3.在修改过 x.a 后,修改 A.a 就不会影响 x.a 了,这是为什么呢?
1 clownpiece 2022-06-25 13:41:17 +08:00 A.a = 0 那个是因为 python 缓存的小整数 用 257 就不会了 对实例属性赋值产生新的对象就类似于函数内对外部存在的对象赋值会产生一个新对象一样,涉及到 python 命名空间的设计 https://docs.python.org/zh-cn/3/tutorial/classes.html#python-scopes-and-namespaces |
2 JYLu OP @clownpiece 谢谢.我大概懂了. |