python函数易错实例(一)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kilig*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值