记一次学习Python中遇到的几个小问题

时间:2021-02-11 04:14:38

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

 输出结果为:

记一次学习Python中遇到的几个小问题记一次学习Python中遇到的几个小问题
1 1 1 1
2 1 2 1
3 3 2 3
View Code

最后一行结果输出为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    

输出结果如下:

记一次学习Python中遇到的几个小问题记一次学习Python中遇到的几个小问题
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]
View Code

第一行的输出结果直觉上很容易理解,就是简单的创造了5个空列表。然而,不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们就能理解输出结果。