龙空技术网

Python 程序员常见错误代码排行Top 3 【详解】

xTech 997

前言:

此刻朋友们对“python发生严重错误”都比较珍视,姐妹们都想要了解一些“python发生严重错误”的相关文章。那么小编同时在网络上收集了一些关于“python发生严重错误””的相关文章,希望看官们能喜欢,小伙伴们一起来了解一下吧!

Top 1 请写出以下代码的输出结果

def cal():    return [lambda x : i + x for i in range(5)]for m in cal():    print(m(100))
Top 2 请写出以下代码的输出结果
list1 = [6, 1, 7, 2]print(list1.sort())print(list1)list2 = [6, 1, 7, 2]print(sorted(list2))print(list2)
Top 3 请写出以下代码的输出结果
def foo(bar=[]):    bar.append("baz")    return barprint(foo())print(foo())print(foo())

解析

1 实际上,你可以将它理解为与下面的代码等价

def cal():    funcs = []    for i in range(5):        def bar(x):            return x + i        funcs.append(bar)    return funcsprint ([m(100) for m in cal()] )

运行代码,解释器碰到for m in cal(): ,循环读取cal()函数中的值,而cal()函数返回的是funcs一个列表对象,这个列表中有5个元素,每个元素都是一个匿名函数bar。

因为匿名函数中的i并不是立即引用后面循环中的i值的,而是在运行嵌套函数bar的时候,才会查找i的值,执行bar函数的时候,i=4。因此,计算结果输出5个104。这个特性就是延迟绑定。

不了解的话,很可能写出有bug的代码。如果想要在每次循环立即获取到i值,可以使用如下的改进方法:

def cal():    return [lambda x, i=i : i + x for i in range(5)]for m in cal():    print(m(100))

2 lst.sort()执行原地排序(改变原始列表)并且不返回任何结果。sorted(lst)总是返回一个新的已排序的列表,不对原始列表做任何更改。

None[1, 2, 6, 7][1, 2, 6, 7][6, 1, 7, 2]

3 一个常见的错误是,人们会认为每次调用函数时,如果不为可选参数提供值,则会将参数设置为默认表达式。例如,在上面的代码中,可能期望重复调用foo()(即,不指定bar参数)将总是返回“baz”,因为假设每次调用foo()(不指定bar参数)时bar被设置为[](即,新的空列表)。

改进修复方法:

def foo(bar=None):    if bar is None:        bar = []    bar.append("baz")    return barprint(foo())print(foo())print(foo())

标签: #python发生严重错误