问题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]
'''
代码解析:
由于传入函数中的参数是一个列表,为一个固定的地址,所以函数每次所做的修改都会保留