Python:为什么两个实例使用相同的列表?

Lei*_*Kan -1 python class list

class Number():
    list = []

number = Number()
number.list.append(0)
print number.list  # [0]

newNumber = Number()
newNumber.list.append(1)
print newNumber.list  # [0,1]
Run Code Online (Sandbox Code Playgroud)

我创建了两个实例,为什么newNumber.list对象有0?为什么number和newNumber使用相同的列表?有人可以帮帮我吗?为什么'i'在后面没有变化?

class Number:
i = 0

number = Number()
number.i = 1
print number.i  # 1

newNumber = Number()
print newNumber.i  # 0
Run Code Online (Sandbox Code Playgroud)

Ant*_*ony 10

那是因为您创建了列表作为类对象的成员,而不是实例对象.如果你想为每个实例创建一个单独的列表,你需要做这样的事情(我改变了list,list_因为给变量赋予与builtins相同的名称是不好的做法).

class Number():
    def __init__(self):
        self.list_ = []
Run Code Online (Sandbox Code Playgroud)

当您访问对象的属性时,它首先检查实例字典,然后检查类对象字典.这就是为什么使它成为类对象的成员并没有给你任何错误.但由于它只是一个列表,因此每个对象都将访问同一个列表.

  • @Eric,那你怎么知道`number.list`是什么意思?它可以是一个存储一些列表的普通属性,但它也可以是`list`类型(构造函数),例如我可以做`number.list('abc')`. (3认同)