难度级别: 困难
预测以下程序的输出:
程序一:
def gfgFunction(): "juejin is cool website for boosting up technical skills" return 1 print (gfgFunction.__doc__[10:14])
输出:
cool
说明: 通过在函数定义开始后的第一行放置一个字符串,为此方法定义了一个文档字符串。可以使用函数的 doc 属性来引用文档字符串。因此它打印索引字符串。
程序二:
class A(object): val = 1 class B(A): pass class C(A): pass print (A.val, B.val, C.val) B.val = 2 print (A.val, B.val, C.val) A.val = 3 print (A.val, B.val, C.val)
输出:
1 1 1 1 2 1 3 2 3
解释:
在 Python 中,类变量在内部作为字典处理。如果在当前类的字典中没有找到变量名,则搜索类层次结构(即其父类),直到找到引用的变量名,如果找不到变量则抛出错误。
因此,在上面的程序中,第一次调用 print() 打印了初始化值,即 1。
在第二次调用中,因为 B.val 设置为 2,输出为 1 2 1。
最后的输出 3 2 3 可能令人惊讶. 这里 B.val 反映的是 2 而不是 3,而不是 3 3 3,因为它之前被覆盖了。
程序三:
check1 = ['Learn', 'Quiz', 'Practice', 'Contribute'] check2 = check1 check3 = check1[:] check2[0] = 'Code' check3[1] = 'Mcq' count = 0 for c in (check1, check2, check3): if c[0] == 'Code': count += 1 if c[1] == 'Mcq': count += 10 print (count)
输出:
12
解释:
当将 check1 分配给 check2 时,我们创建了对同一列表的第二个引用。对 check2 的更改会影响 check1。当将 check1 中所有元素的切片分配给 check3 时,我们创建了 check1 的完整副本,可以独立修改(即 check3 中的任何更改都不会影响 check1)。
因此,在检查 check1 时,“代码”得到匹配并且计数增加到 1,但 Mcq 不会匹配,因为它仅在 check3 中可用。
现在在这里检查 check2 也匹配“代码”,导致计数值为 2。
最后,在检查与 check1 和 check2 分开的 check3 时,只有 Mcq 匹配并且计数变为 12。
程序四:
def gfg(x,l=[]): for i in range(x): l.append(i*i) print(l) gfg(2) gfg(3,[3,2,1]) gfg(3)
输出:
[0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0, 1, 4]
说明:
第一个函数调用应该相当明显,循环将 0 和 1 附加到空列表 l 中。l 是指向存储在内存中的列表的变量的名称。第二次调用从在新的内存块中创建一个新列表开始。l 然后引用这个新列表。然后它将 0、1 和 4 附加到这个新列表中。那太好了。第三个函数调用很奇怪。它使用存储在原始内存块中的原始列表。这就是为什么它从 0 和 1 开始。
如果大家发现任何不正确的地方,都可以在下方评论区告诉我,互相学习,共同进步!