欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python函数易错实例(一)

程序员文章站 2022-03-29 14:40:23
...

问题1:隐式内存分配

代码:

// An highlighted block
my_list = [[1, 2, 3]]*2  
print(my_list)
print(my_list[0][0])
my_list[0][1] = 'k'
my_list[0][0] = 'hack'
print(my_list)

'''
输出:
[[1, 2, 3], [1, 2, 3]]
1
[['hack', 'k', 3], ['hack', 'k', 3]]
'''

代码解析:
python函数易错实例(一)

链接: 隐式内存分配.

问题2:循环中的陷阱

data = [6, 4, 3, 2]
for n in data:
    if not n%2:
        data.remove(n)
print(data)
#输出:[4, 3]

代码解析:
由于在删除元素的同时下标也在发生变化,所以导致4被跳过,就留了下来

问题3:迭代器的坑

hack=(n for n in range(7))
n1 = 2 in hack
print (n1)
n2 = 6 in hack 
print (n2)
n3 = 5 in hack 
print (n3)


'''
输出:
True
True
False
'''

由于生成的是一个迭代器对象,迭代器只能向后不能向前,所以就算之前有所判断的元素,也只会抛出False

问题4:同名变量

for i in range(3):
    print (i)
    i += 2
    print(i)
    print('一轮结束')


'''
输出:
0
2
一轮结束
1
3
一轮结束
2
4
一轮结束
'''

代码解析:
python函数易错实例(一)
由上面的运行结果可以看出,循环中的i与循环内部被引用的i并不是一个i只是同名而已,故两者并无影响

链接: 同名变量引用.

问题5:函数陷阱

// An highlighted block
i = 8
def print_i(var=i):
    print(var-1)
i = 7
print_i()
i = 6
print_i()
i = 5
print_i()
'''
输出:
7
7
7

'''

代码解析:
由于在调用函数的时候并没有传入参数,所以相当于函数的参数一直是默认值,故i的变化对函数并无影响

问题6:函数参数问题(传入列表)

代码:

def append_L(a,L=[]):         
    L.append(a)
    return L
append_L(0)
append_L(1)
append_L(2)            
print(append_L(2))            
print(append_L(3)) 

'''
输出:
[0, 1, 2, 2]
[0, 1, 2, 2, 3]
'''

代码解析:
由于传入函数中的参数是一个列表,为一个固定的地址,所以函数每次所做的修改都会保留

相关标签: 实训