繁体   English   中英

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

[英]trying to understand why a tuple is preferred over a list for a specific python example (from a tutorial)

我试图通过在网上找到的教程来学习python中的迭代器和生成器,该教程以这个fibonacci迭代器为例。 我在第9-11行的评论中遇到麻烦。 “将self.fn1和self.nf2的旧值用于分配新值”是什么意思? 我知道元组是不可变的对象,但是我在这里看不到为什么使用元组而不是列表。 我想我看不到为什么在这里使用元组比使用列表更好,并且我想更好地理解是否有人可以帮助解释它:/

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

这在使用tuplelist之间在功能上没有区别。 他们试图提出的观点是,用一个陈述来做到这一点是很好的。

如果要将单行拆分为多个语句,最终会得到类似以下内容的结果:

oldfn2 = self.fn2
self.fn2 = self.fn1
self.fn1 = self.fn1 + oldfn2
return oldfn2

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

self.fn1 = X
self.fn2 = Y
oldfn2   = Z

由于self.fn1在其旧值可以分配给self.fn2之前已重新分配,因此无法self.fn2 重新分配分配可以解决此问题,但是通过元组分配,您无需担心次序。

这本来可以不用括号写,顺便说一句:

self.fn1, self.fn2, oldfn2 = self.fn1+self.fn2, self.fn1, self.fn2

该注释意味着,不要使用像这样的多个分配:

# would be incorrect
self.fn1 = self.fn1+self.fn2 # because fn1 is overwritten here
self.fn2 = self.fn1
oldfn2 = self.fn2

他们使用元组分配:

(self.fn1,self.fn2,oldfn2) = (self.fn1+self.fn2,self.fn1,self.fn2)

这更短,并且还可以确保在第一次分配发生之前计算所有新值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM