首页 > 解决方案 > 什么是可变阴影?

问题描述

https://stackoverflow.com/a/37657923/8061009声明该程序:

class Parent(object):
    i = 5;
    def __init__(self):
        self.i = 5

    def doStuff(self):
        print(self.i)

class Child(Parent, object):

    def __init__(self):
        super(Child, self).__init__()
        self.i = 7

class Main():

    def main(self):
        m = Child()
        print(m.i) #print 7
        m.doStuff() #print 7

m = Main()
m.main()

输出将是:

$ python Main.py 
7
7

然后,该答案将其与 Java 中的类似程序进行比较:

原因是因为 Java 在 Child 类中的 int i 声明使 i 成为类范围变量,而在 Python 子类化中没有这样的变量阴影。如果在 Java 的 Child 类中删除 int i,它也会打印 7 和 7。

在这种情况下,变量阴影意味着什么?

标签: pythonpython-3.x

解决方案


在这种情况下,可变阴影意味着什么?

可变阴影在所有情况下都意味着相同的事情,与上下文无关。它被定义为当一个变量“隐藏”另一个具有相同名称的变量时。因此,当发生变量阴影时,有两个或多个同名变量,它们的定义取决于它们的作用域(意味着它们的值可能因作用域而异)。快速示例:

In [11]: def shadowing():
    ...:     x = 1
    ...:     def inner():
    ...:         x = 2
    ...:         print(x)
    ...:     inner()
    ...:     print(x)
    ...:

In [12]: shadowing()
2
1

请注意,我们inner()首先调用它,它分配x给 be 2,并按原样打印2。但这不会修改at 外部范围x(即 first x),因为xin遮蔽了 first 。所以,在我们调用之后,调用返回,现在第一个返回范围,所以最后一个打印输出。innerxinner()x1

在此特定示例中,您引用的原始作者说没有发生阴影(并且要清楚:没有在实例级别发生)。您会注意到,i在父级中,与在子级中的相同i。如果出现阴影,它们将具有不同的值,就像上面的示例中一样(即,父级将拥有一个变量的副本,i而子级将拥有一个名为 的变量的不同副本i)。但是,他们没有。i父母和孩子中7。原作者指出 Python 的继承机制在这方面与 Java 不同。


推荐阅读