python – 将生成器附加到循环中的堆栈,生成器指向最终循环变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 将生成器附加到循环中的堆栈,生成器指向最终循环变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1584字,纯文字阅读大概需要3分钟。
内容图文
我正在做一些图遍历.在每个点上,我保存了一个可以探索的其他可能选项的生成器.后来,我探索了一些这些生成器,但它不起作用.
这是一个简化的示例,您可以在其中看到所有生成器中的“node”变量都设置为3. (因此生成器指向“node”变量,但“node”变量在生成器消耗之前发生变化.
在我的特定情况下,我可以存储一些指针并添加如何处理这些指针以重新创建生成器的逻辑 – 但这是一个丑陋的解决方案.
有一个简单的方法吗?
node_size = {1:1, 2:2, 3:1, 4:3}
iters = []
for node in range(1,4):
it = (1 + node_size[node]+j for j in xrange(3))
#it = iter(list(it)) #remove comment to get correct result but very slow.
iters.append(it)
for iter_ in iters:
print list(iter_)
"""
Correct Output
[2, 3, 4]
[3, 4, 5]
[2, 3, 4]
"""
"""
Actual Output:
[2, 3, 4]
[2, 3, 4]
[2, 3, 4]
"""
解决方法:
您的生成器表达式引用全局变量节点.由于这是genexp中的一个自由变量,因此它会关闭名称,而不是值.每次从生成器中获取项时,将使用node的当前值来计算表达式1 node_size [node] j.也就是说,每次生成器前进时都会读取节点的值,而不是一次创建节点的值.当您开始从生成器中获取项目时,节点为3,因此生成器中的所有项都反映该值.
要获得所需的内容,需要在生成器函数本身中绑定节点.一个快速的方法是强制节点进入genexp的循环部分:
it = (1 + node_size[node]+j for node in [node] for j in xrange(3))
由于在创建genexp时仅对循环部分进行一次求值,因此这将修复genexp范围内的单个节点值.
如果这种方式太难看了你,你将不得不编写一个显式的生成器函数而不是使用genexp:
def gen(nodeVal):
for j in xrange(3):
yield 1 + node_size[nodeVal]+j
for node in range(1, 4):
iters.append(gen(node))
这里的生成器关闭名称nodeVal,但由于每个生成器都是由一个单独的函数调用创建的,因此每个生成器都有自己的nodeVal值,一切都很好.
内容总结
以上是互联网集市为您收集整理的python – 将生成器附加到循环中的堆栈,生成器指向最终循环变量全部内容,希望文章能够帮你解决python – 将生成器附加到循环中的堆栈,生成器指向最终循环变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。