gpt4 book ai didi

python-3.x - 生成器函数在各种迭代上下文中的行为不同

转载 作者:行者123 更新时间:2023-12-01 02:32:48 24 4
gpt4 key购买 nike

所以我有这个用于非递归排列的生成器函数,当我在 for 循环中使用它时,我得到了我期望的结果:

>>> for p in permutate3( "abc" ): print( p )
...
['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'a', 'b']
['c', 'b', 'a']

但是一旦我在列表中使用它或使用参数解包打印我得到这个奇怪的输出:

>>> list( permutate3( "abc" ) )
[['c', 'b', 'a'], ['c', 'b', 'a'], ['c', 'b', 'a'], ['c', 'b', 'a'], ['c', 'b', 'a'], ['c', 'b', 'a']]
>>> print( *permutate3( "abc" ) )
['c', 'b', 'a'] ['c', 'b', 'a'] ['c', 'b', 'a'] ['c', 'b', 'a'] ['c', 'b', 'a'] ['c', 'b', 'a']

为什么会这样?..

函数本身是:

def permutate3( s ):
l = len( s )
taken = [ False ] * l
permutation = [ None ] * l
current = 0
stack = [ 0 ]

while True:
while stack[-1] < l:
if not taken[ stack[-1] ]:
permutation[current] = s[ stack[-1] ]
if current == l-1:
yield permutation
else:
taken[ stack[-1] ] = True
stack.append( 0 )
current+=1
break
stack[-1]+=1
else:
stack.pop()
if len( stack ) == 0:
break
else:
current-=1
taken[ stack[-1] ] = False
stack[-1]+=1
continue

最佳答案

假我。我的函数每次都产生对同一个对象的引用,该对象由函数更改以进行后续排列。显然应该是 yield list( permutation )。

关于python-3.x - 生成器函数在各种迭代上下文中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com