类属性和对象属性

学习python我正在重写我的一些旧程序,以查看
python的优缺点,踏入一些怪异(至少对我来说)
行为。
在这里简化了
编码:
myList = [4在范围内(4)]
myint = 4
[4、4、4、4]
4
[4、4、4、4]
4
[4、4、3、4]
3
[4、4、3、4]
4
我不会指望第二A.Mylist会像它那样改变
从那以后,对我来说,我只改变了B.Mylist。而且,为什么只有
列表更改而不是整数?
我尝试的一件事是:
myList = []
myint = 4
def __init __(自我):
self.mylist = [4在范围内(4)]
[4、4、4、4]
[4、4、4、4]
[4、4、3、4]
[4、4、4、4]
正如您所看到的,它正如我预期的那样起作用。
现在问题,为什么?

# 回答1


Superze写道:
myList = [4在范围内(4)]
myint = 4
[4、4、4、4]
4
[4、4、4、4]
4
[4、4、3、4]
3
[4、4、3、4]
4
我不会指望第二A.Mylist会像它那样改变
从那以后,对我来说,我只改变了B.Mylist。而且,为什么只有
列表更改而不是整数?
我尝试的一件事是:
myList = []
myint = 4
def __init __(自我):
self.mylist = [4在范围内(4)]
[4、4、4、4]
[4、4、4、4]
[4、4、3、4]
[4、4、4、4]
正如您所看到的,它正如我预期的那样起作用。
现在问题,为什么?
因为您将myList声明为 *类 * - 级别的变量,这意味着 *all *
该类的实例(您的情况下A和B) *共享 *。 Python没有
声明 *实例 *变量您的操作方式。
相反,这样做:
类foo(对象):
def __init __(自我):
self.mylist = []
为了避免常见的陷阱,您可能会下一步:默认参数
在函数(和方法)中仅评估 *一次 *,当定义时 - 不是
之后!
所以
def foo(Some_arg = []):
soming_arg.append(" a")
打印一些_arg
foo()
foo()
会导致
['一个']
['a','a']
被打印出来。
diez
# 回答2


因为您将myList声明为 *类 * - 级别的变量,这意味着 *all *
有趣的是,但这并不能解释行为的差异
mylist和myint
据我所知,两者都是班级级变量,因此
B也应该分享
很好地提醒默认参数:)
# 回答3


在2008年10月6日星期一上午9:38上午,超级 他们确实分享了它,直到您在b中分配了一个实例变量,
遮蔽了类变量。例子:
myint = 4
4
4
4
4
3
4
一旦您将名称B.Myint绑定到一个新值,它就会创建一个
实例变量。这隐藏了test1.myint的价值。
- -
杰瑞
# 回答4


Tyvm Diez和Jerry
现在我明白了这是如何工作的

标签: python

添加新评论