美文网首页
关于列表是可变类型的问题

关于列表是可变类型的问题

作者: 虚无一代 | 来源:发表于2018-01-02 18:51 被阅读0次

在学习廖雪峰网站生成器时,看到练习题回答中的一个问题,感觉自己也很容易犯这样的错误。

# 生成器之杨辉三角
# 期待输出:
# [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]


def triangles():
    list1 = [1]
    while True:
        yield(list1)
        list1.append(0)
        list1 = [list1[i-1]+list1[i] for i in range(len(list1))]


n = 0
results = []
for t in triangles():
    print(t)
    results.append(t)
    print(results)
    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('测试失败!')

这段代码会测试失败的原因:

因为每次测试代码中for循环执行之初,会执行yield之后的append代码,对上个生成器末尾加0
故最后的results是:

[[1, 0], [1, 1, 0], [1, 2, 1, 0], [1, 3, 3, 1, 0], [1, 4, 6, 4, 1, 0], [1, 5, 10, 10,5, 1, 0], [1, 6, 15, 20, 15, 6, 1, 0], [1,7, 21, 35, 35, 21, 7, 1, 0], [1, 8, 28, 56, 70, 56, 28, 8, 1, 0], [1, 9, 36, 84, 126,126, 84, 36, 9, 1]]

根源在于没有清醒认识列表是可变类型
例子:

a = [1, 1]
p = []
p.append(a)
print(p)
a.append(0)
print(p)

输出结果:

[[1, 1]]
[[1, 1, 0]]

triangle()函数中的正确代码可以为:

def triangle():
    yield(list1)
    list1 = [list1[x] + list1[x + 1] for x in range(len(list1) - 1)]
    list1.append(1)
    list1.insert(0, 1)

相关文章

  • 关于列表是可变类型的问题

    在学习廖雪峰网站生成器时,看到练习题回答中的一个问题,感觉自己也很容易犯这样的错误。 这段代码会测试失败的原因: ...

  • python 基础—增删改查

    (一)、列表: 1、列表里的数据分为:可变类型数据 and不可变类型数据可变类型数据有 : 数组、集合、字典不可变...

  • python增删改查

    (一)、列表: 1、列表里的数据分为:可变类型数据 and不可变类型数据可变类型数据有 : 数组、集合、字典不可变...

  • Python 基础— 列表的增删改查

    (一)、列表: 1、列表里的数据分为:可变类型数据 and不可变类型数据可变类型数据有 : 数组、集合、字典不可变...

  • python元组与列表

    Python中的基本顺序存储结构是列表与元组,其中列表是可变数据类型,元组是不可变数据类型。可变指的是列表中的元素...

  • 2018-08-27 day06-容器类型

    一、认识列表 列表是python中的容器类型。有序的,可变的容器。(可变是列表中的元素和元素位置可变、个数可变)元...

  • day6 list列表及其操作

    1.什么是列表(list) 列表是Python提供的容器型数据类型可变-列表中的每个元素的值可变,列表的长度可变,...

  • Python可变类型与不可变类型

    Python可变类型与不可变类型 1、可变类型:List(列表),Dic(字典),Set(集合) 2、不可变类型:...

  • 2018-08-27 day6-list和tuple

    列表LIST 认识list 列表是有序、可变的容器类型(元素数量、值可变),内部的元素可以任何类型. 列表是一种序...

  • 2018-12-29

    一、 了解列表 1、 什么是列表(list) 列表是python提供的容器型数据类型。可变且有序。可变 - 列表中...

网友评论

      本文标题:关于列表是可变类型的问题

      本文链接:https://www.haomeiwen.com/subject/fozngxtx.html