杨辉三角用Python生成器实现与‘赋值’操作

本文探讨了Python生成器中使用列表切片的原因,详细解释了为何不能直接yield列表并展示了如何通过切片实现列表的独立副本。内容涉及Python内存管理、赋值操作与深浅拷贝的概念,并预告了后续关于Python特殊赋值和拷贝操作的文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是定义的主要函数:

def yh_tri():
  L=[1]
  while True:
    yield L[:]#列表在变化,所以切片当前列表所有元素
    L.append(0)#补最后一个元素0,为了下式全部成立
    L=[L[i]+L[i-1] for i in range(len(L))]#公式不懂对着推导一遍就会了

为什么yield行为什么要对L列表切片而不是直接yield L,因为如果这样生成器获得的元素其实就是L,这样当后面给L补加元素0时生成器中的元素也会随之加0。这就不是我们想要的列表。
验证代码如下:

L=[1,2,3]
C=L
print(id(L),id(C))
D=L[:]
print(id(L),id(D))
1858683062280 1858683062280#C和L地址相同
1858683062280 1858683406856#D和L地址不同

其实C=L可以理解为C语言中的给变量起别名,它们共享同一份内存空间。除了列表还有其它数据类型这样的‘赋值’操作也都可以理解为给变量起别名,共享的是同一份数据。

而谁说Python相同对象只有一份,除了深浅拷贝,通过全切片也可以让相同对象复制一份到另一个变量(全切片可以看做是浅拷贝,具体这里不细讲)。

之后会出一篇文章总结一下Python中的不寻常‘赋值’和深浅拷贝操作。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值