【问题标题】:Static class variables in Python -- Lists & Objects [duplicate]Python中的静态类变量——列表和对象[重复]
【发布时间】:2015-08-28 20:08:26
【问题描述】:

我是 Python 新手,更多的是 Java 背景。我理解 Python 中静态类变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如,它们在类的实例之间共享。

换句话说:

class box ():

    name = ''
    contents = []

    def __init__ (self, name):
        self.name = name

    def store (self, junk):
        self.contents.append(junk)

    def open (self):
        return self.contents

现在,如果我创建两个实例并尝试向它们添加内容:

a = box('Box A')
b = box('Box B')

a.store('apple')
b.store('berry')

print a.open()
print b.open()

输出:

['apple','berry']
['apple','berry']

很明显,它们在 box 的两个实例之间共享。

现在我可以通过执行以下操作来解决它:

def store (self, junk):
    temp = self.contents
    temp.append(junk)
    self.contents = temp

但是有没有更清洁/更传统的方式?有人可以解释为什么会这样吗?

【问题讨论】:

标签: python list static static-variables class-variables


【解决方案1】:

在您的情况下,这两个变量都是类变量。但是,您为对象 A 和 B 设置了不同的字符串,实际上您正在再次初始化它们。另一方面,列表不会再次初始化,因此来自对象 A 和 B 的列表都指向内存中的同一个对象。因此,附加项目会将项目附加到内存中的同一列表中。因此,结果。

你想这样写:

class box ():


    def __init__ (self, name):
        self.name = name
        self.contents = []

    def store (self, junk):
        self.contents.append(junk)

    def open (self):
        return self.contents

【讨论】:

    【解决方案2】:

    关键字self 使它们独立,就好像您在说self.name 属于box() 类的当前实例:

    class box ():
    
        def __init__ (self, name):
            self.name = name
            self.contents = []
    
        def store (self, junk):
            self.contents.append(junk)
    
        def open (self):
            return self.contents
    

    【讨论】:

    • 太棒了!我想我没有像我想象的那样理解这些概念。谢谢!
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多