我上课了
>>> class Foo:
... ls=[]
...
>>> f1=Foo()
>>> f2=Foo()
>>> f1.ls.append(1)
>>> f1.ls.append(2)
>>> print f1.ls
[1, 2]
>>> print f2.ls
[1, 2] #I expect its result is empty [], why
>>> f2.ls=[]
>>> print f1.ls
[1, 2]
>>> print f2.ls
[]
# If f1.ls and f2.ls refer to the same list, since i modify f2.ls,
# the f1.ls is empty ,too. Does the statement 'f2.ls=[]' add new attribute
# to f2. Where do f1.ls and f2.ls refer and how it happens
我想使用一个类和声明许多变量。如果我希望所有变量都有不同的列表。我喜欢这样吗
class Foo:
pass
f1=Foo()
f2=oo()
f1.ls=[]
f2.ls=[]
do others
有没有更简单更好的方法。 原谅我对python类的无知。提前谢谢
当你说
ls
被定义为类变量,您创建的所有对象都将有一个同名的变量,并且该变量将指向类的ls
值中的当前值。你知道吗当你说
实际上,您正在对原始对象进行变异。这就是为什么变化也反映在
f2
中(因为它们都引用同一个对象)。但当你说实际上,您正在
f2
对象上创建一个变量,该对象引用一个空列表对象。现在,ls
对象不同于f1
的ls。你可以用这句话来证实这一点如果你真的想在你创建一个对象的时候得到一个新的对象。必须创建一个实例变量,如下所示
现在将
ls
绑定到类的当前实例并使其指向空列表。所以,这对于每个实例都是不同的。你知道吗直接在类中定义变量会产生类级变量。因此,
ls
并非对所有实例都是唯一的,而是类Foo
的属性。但是,仍然可以通过它的实例访问它,这就是您所做的。你知道吗以便:
实例级变量对于每个实例都是唯一的,可以在
__init__
函数中定义,如下所示:这样,类Foo就没有属性
ls
;相反,用__init__
构造的每个实例都有:类级赋值创建类变量。要创建实例变量,请在构造函数中执行以下操作:
相关问题 更多 >
编程相关推荐