【问题标题】:Python:why two instance use the same list?Python:为什么两个实例使用相同的列表?
【发布时间】:2013-04-27 16:13:03
【问题描述】:
class Number():
    list = []

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

newNumber = Number()
newNumber.list.append(1)
print newNumber.list  # [0,1]

我创建了两个实例,为什么 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

【问题讨论】:

  • 我认为你必须使用 self.list。看到这个问题的自我关键字:stackoverflow.com/questions/6990099/…
  • 因为您的代码中定义的list 属于class 而不是实例。您需要写 self.list = [] 以使每个实例拥有一个 list

标签: python list class


【解决方案1】:

这是因为您将列表创建为类对象的成员,而不是实例对象。如果你想为每个实例创建一个单独的列表,你需要这样做(我将list 更改为list_,因为给变量赋予与内置函数相同的名称是不好的做法)。

class Number():
    def __init__(self):
        self.list_ = []

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

【讨论】:

  • 为什么有与内置函数同名的成员是个问题?
  • @Eric,那你怎么知道number.list 是什么意思?它可以是存储一些列表的普通属性,但也可以是list 类型(构造函数),例如我可以使用number.list('abc')
  • 它不会像局部或全局变量那样直接导致问题,但它确实让事情变得更加混乱。
  • 为什么我会期望我的班级成员成为list 对象?我认为没有理由期望 a.listlist 有任何关系
  • class Number: i = 0 number = Number() number.i = 1 print number.i # 1 newNumber = Number() print newNumber.i # 0 为什么 newNumber.i 不是 1?
猜你喜欢
  • 2018-05-03
  • 2019-09-14
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多