首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试理解为什么在特定的python示例中,元组比列表更受欢迎(来自教程)

尝试理解为什么在特定的python示例中,元组比列表更受欢迎(来自教程)
EN

Stack Overflow用户
提问于 2011-04-04 05:05:49
回答 3查看 163关注 0票数 1

我正在尝试学习python中的迭代器和生成器是什么,通过我在网上找到的一个教程,它使用了这个斐波那契迭代器作为例子。我在第9-11行的注释中遇到了问题。“在分配新值时使用self.fn1和self.nf2的旧值”是什么意思?我知道元组是不可变的对象,但我不明白为什么使用元组比使用列表更可取。我想我不明白为什么在这里使用元组比使用列表更好,我想更好地理解是否有人可以帮助解释它:/

代码语言:javascript
运行
复制
4 class fibnum:
5     def __init__(self):
6       self.fn2 = 1 # "f_{n-2}"
7       self.fn1 = 1 # "f_{n-1}"
8     def next(self): # next() is the heart of any iterator
9       # note the use of the following tuple to not only save lines of
10      # code but also to insure that only the old values of self.fn1 and
11      # self.fn2 are used in assigning the new values
12      (self.fn1,self.fn2,oldfn2) = (self.fn1+self.fn2,self.fn1,self.fn2)
13      return oldfn2
14    def __iter__(self):
15      return self

来自:http://heather.cs.ucdavis.edu/~matloff/Python/PyIterGen.pdf

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-04 05:11:04

在这里使用list是没有意义的,因为您总是要处理三个元素,而不是数量可变的元素。通过“确保sic在分配新值时只使用self.fn1self.fn2的旧值”,程序员似乎是在将这种方法与替代方法进行比较:

代码语言:javascript
运行
复制
self.fn1 = X
self.fn2 = Y
oldfn2   = Z

这将无法开箱即用,因为在将其旧值赋给self.fn2之前,self.fn1会被重新赋值。重新排序赋值可以解决这个问题,但是使用元组赋值,您不需要担心顺序。

这段代码本可以不使用括号,顺便说一句:

代码语言:javascript
运行
复制
self.fn1, self.fn2, oldfn2 = self.fn1+self.fn2, self.fn1, self.fn2
票数 1
EN

Stack Overflow用户

发布于 2011-04-04 05:09:47

在这里,使用tuple和使用list在功能上没有区别。他们试图表达的观点是,用一句话就能做到这一点。

如果要将这一行拆分为多个语句,则会得到如下结果:

代码语言:javascript
运行
复制
oldfn2 = self.fn2
self.fn2 = self.fn1
self.fn1 = self.fn1 + oldfn2
return oldfn2
票数 2
EN

Stack Overflow用户

发布于 2011-04-04 05:12:40

注释意味着不使用像这样的多个赋值:

代码语言:javascript
运行
复制
# would be incorrect
self.fn1 = self.fn1+self.fn2 # because fn1 is overwritten here
self.fn2 = self.fn1
oldfn2 = self.fn2

它们使用元组赋值:

代码语言:javascript
运行
复制
(self.fn1,self.fn2,oldfn2) = (self.fn1+self.fn2,self.fn1,self.fn2)

它更短,并且还确保在第一次赋值发生之前计算所有新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5532516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档