signed

QiShunwang

“诚信为本、客户至上”

python函数易错实例(一)

2020/8/20 12:22:20   来源:

python函数易错实例

  • 问题1:隐式内存分配
  • 问题2:循环中的陷阱
  • 问题3:迭代器的坑
  • 问题4:同名变量
  • 问题5:函数陷阱
  • 问题6:函数参数问题(传入列表)

问题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]]
'''

代码解析:
在这里插入图片描述

链接: 隐式内存分配.

问题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
一轮结束
'''

代码解析:

由上面的运行结果可以看出,循环中的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]
'''

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