前言:
此刻朋友们对“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发生严重错误