some confusion with variables declared by python class
我上课了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | >>> 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 |
我想使用一个类并声明许多变量。如果我希望所有变量都有不同的列表。我喜欢这个吗
1 2 3 4 5 6 7 | class Foo: pass f1=Foo() f2=oo() f1.ls=[] f2.ls=[] do others |
有更简单更好的方法吗?请原谅我对python类的无知。提前谢谢
类级分配创建类变量。要创建实例变量,请在构造函数中执行此操作:
1 2 | def __init__(self): self.ls = [] |
当你说
1 2 | class Foo: ls=[] |
当你说
1 | f1.ls.append(1) |
实际上您正在改变原始对象。这就是为什么变化也反映在
1 | f2.ls = [] |
实际上,您正在
1 2 | print f1.ls is f2.ls # Will print False print f1.ls is Foo.ls # Will print True |
如果你真的想在你创建一个对象的时候得到一个新的对象。您必须创建一个实例变量,如下所示
1 2 3 4 5 6 | class Foo: def __init__(self): self.ls = [] f1, f2 = Foo(), Foo() print f1.ls is f2.ls # Will print False |
现在您将
直接在类内定义一个变量会给出一个类级变量。因此,
1 2 | class Foo: ls = [] |
以便:
1 2 3 4 5 6 7 8 9 | >>> f1 = Foo() >>> f2 = Foo() >>> Foo.ls.append(1) >>> Foo.ls [1] >>> f1.ls [1] >>> f2.ls [1] |
实例级变量对每个实例都是唯一的,可以在
1 2 3 | class Foo: def __init__(self): self.ls = [] |
这样,类foo就没有属性
1 2 3 4 5 6 7 8 9 10 11 | >>> 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 [] |
ls是您定义的静态变量。你自己在初始化中,所以你可以在内存中有不同的ls。