1、下面这段代码的输出结果将是什么?
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x
输出结果为:
1 1 1 1 2 1 2 1 3 3 2 3
最后一行结果输出为3 2 3 而不是 3 2 1。为什么改变parent.x的同事也改变了Child2.x的值?但与此同事没有改变Child1.x的值
在Python中,类变量在内部是以字典的形式进行传递。
如果一个变量名没有在当前类下的字典中发现。则在更高级的类(如它的父类)中尽心搜索直到引用的变量名被找到。(如果引用变量名在自身类和更高级类中没有找到,将会引发一个属性错误)。
因此,在弗雷中设定x=1,让变量x类(带有值1)能过在其类和其子类中被引用到。这就是为什么第一个打印语句输出的结果是1 1 2
因此,如果它的任何一个子类被覆写了值(例如说,当我们执行语句Child.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是 1 2 1
最终,如果这个值在父类中进行了修改,(例如说,当我们执行语句Child.x=2),这个值只在子类中进行了修改,(例如说,当我们执行语句Parent.x=3),这个改变将会影响那些还没有覆写子类的值(在这个例子中就是Child2)这就是为什么第三打印语句输出结果是 3 2 3。
2、下面代码的输出结果将是什么?
list = ['a', 'b', 'c', 'd', 'e'] print list[10:]
这两行diamante将会输出'[]',并不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。
3、考虑下列代码片段:
list = [[]] * 5 list list[0].append(10) list list[1].append(20) list list.append(30)
list
输出结果如下:
1 [[], [], [], [], []] 2 [[10], [10], [10], [10], [10]] 3 [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]] 4 [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30]
第一行的输出结果直觉上很容易理解,就是简单的创造了5个空列表。然而,不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们就能理解输出结果。