我有班级
>>> 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类的无知。提前致谢
答案 0 :(得分:3)
类级别赋值创建类变量。要创建实例变量,请在构造函数中执行此操作:
def __init__(self):
self.ls = []
答案 1 :(得分:2)
直接在类中定义变量会给出一个类级变量。因此,ls
并非所有实例都是唯一的,而是类Foo
的属性。但是,它仍然可以通过它的实例进行访问,这就是你所做的。
class Foo:
ls = []
那样:
>>> f1 = Foo()
>>> f2 = Foo()
>>> Foo.ls.append(1)
>>> Foo.ls
[1]
>>> f1.ls
[1]
>>> f2.ls
[1]
实例级变量对每个实例都是唯一的,可以在__init__
函数中定义,如下所示:
class Foo:
def __init__(self):
self.ls = []
这样,类Foo没有属性ls
;相反,每个用__init__
构造的实例都会:
>>> f1 = Foo()
>>> f2 = Foo()
>>> Foo.ls.append(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class Foo has no attribute 'ls'
>>> f1.ls.append(1)
>>> f1.ls
[1]
>>> f2.ls
[]
答案 2 :(得分:2)
当你说
时class Foo:
ls=[]
ls
被定义为一个类变量,您创建的所有对象将具有一个具有相同名称的变量,该变量将指向类的ls
值中的当前值。 / p>
当你说
时f1.ls.append(1)
您实际上正在改变原始对象。这就是为什么变化也反映在f2
中(因为它们都指的是同一个对象)。但是当你说
f2.ls = []
您实际上是在f2
对象上创建一个变量,该变量引用一个空列表对象。现在,ls
对象与f1
的ls不同。您可以使用此声明
print f1.ls is f2.ls # Will print False
print f1.ls is Foo.ls # Will print True
如果您确实想在创建对象时获取新对象。你必须创建一个实例变量,比如这个
class Foo:
def __init__(self):
self.ls = []
f1, f2 = Foo(), Foo()
print f1.ls is f2.ls # Will print False
现在,您将ls
绑定到类的当前实例,并使其指向空列表。因此,每个实例都会有所不同。
答案 3 :(得分:0)
ls是您定义的静态变量。你在 init 中自我。所以你可以在内存中有不同的ls。