Python: 类属性在方法内是否等同于局部变量?

7 投票
1 回答
3760 浏览
提问于 2025-04-16 00:37

在Python中,我知道查找局部变量的速度比查找全局变量要快很多。所以:

a = 4
def function()
    for x in range(10000):
        <do something with 'a'>

def function()
    a = 4
    for x in range(10000):
        <do something with 'a'>

要慢。

那么,当我查看一个类的定义,里面有一个属性和一个方法时:

class Classy(object):
    def __init__(self, attribute1):
        self.attribute1 = attribute1
        self.attribute2 = 4
    def method(self):
        for x in range(10000):
            <do something with self.attribute1 and self.attribute2>

我使用self.attribute的方式更像是我的第一个函数还是第二个函数呢?如果我从Classy这个类继承,并尝试从我的子类中的一个方法访问attribute2,这又会怎样呢?

1 个回答

4

局部变量运行得很快,因为解释器不需要去查找字典。它在编译时就知道会有多少个局部变量,并且会生成指令像访问数组一样来访问这些变量。

成员属性需要查字典,所以它们的执行方式和你第一个例子中使用全局变量的方式类似。

为了提高速度,你可以这样做:

attribute1 = self.attribute1
# do stuff with attribute1

这样做会在局部变量中覆盖attribute1,这样只需要查一次字典。我不会随便这样做,除非我通过性能分析发现某个方法是瓶颈。

撰写回答