Python list 的append 和 组合

看了廖雪峰老师的python教程,在生成器部分有一个习题,要用生成器写出一个杨辉三角,写的时候遇到了一个问题,看了下面的回复主要都是 append 和 + 的困惑,我就写了一遍,然后厚颜无耻的给别人回复了一下。

没错,就是介个厚颜无耻的人

主要的还是append  类似引用,会对原list 产生改变

在廖老师提供的校验逻辑里面 result 也是append  ,这样连锁反应  L变,L变,L变了 t 也变,t都变了result 也变。

1.用append 需要改变校验逻辑,主要目的是改变指针

def triangles():
	N=[1] 
	while True: 
		yield N 
		if len(N) ==1 : 
			N.append(1)   # append会改变原list  也就是第一次的t 会变成[1,1]
			# N = N+[1]
		else: 
			N = [N[i]+N[i+1] for i in range(len(N)-1)] 
			N.insert(0,1) 
			N.append(1)
#校验
n = 0
results = []
first = [] #新增
for t in triangles():
	if n==0:
		first = [] + t    # 新增这个 目的还是解除引用,相当于一个新空间 first 不会随着t变化而变化
		results.append(first) #追加进result
	else:
		results.append(t)
	n = n + 1
	if n == 10:
		break
if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
	print('测试通过!')
else:
	print('测试失败!')

第二 不用append 用 +

def triangles():
	N=[1] 
	while True: 
		yield N 
		if len(N) ==1 : 
			# N.append(1)   # append会改变原list  也就是第一次的t 会变成[1,1]
			N = N+[1]
		else: 
			N = [N[i]+N[i+1] for i in range(len(N)-1)] 
			N.insert(0,1) 
			N.append(1)
#校验
n = 0
results = []
# first = [] #新增
for t in triangles():
	# if n==0:
	# 	first = [] + t    # 新增这个 目的还是解除引用,相当于一个新空间 first 不会随着t变化而变化
	# 	results.append(first) #追加进result
	# else:
	results.append(t)
	n = n + 1
	if n == 10:
		break
if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
	print('测试通过!')
else:
	print('测试失败!')

其实完全不需要判断 len(N)==1 的 if 逻辑

猜你喜欢

转载自blog.csdn.net/benpaodelulu_guajian/article/details/81611711
今日推荐