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

下面是定义的主要函数:

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中的不寻常‘赋值’和深浅拷贝操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值