与python类声明的变量有些混淆

时间:2014-01-18 07:07:25

标签: python class

我有班级

>>> 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类的无知。提前致谢

4 个答案:

答案 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。