【发布时间】:2021-01-01 13:56:05
【问题描述】:
我有一个问题 -> 我想产生信息并将其放入类似的对象中。但似乎当我将结果附加到列表时,所有内容都指向内存中的相同地址,我想。
def call(i):
for j in range(i):
yield j+1
def ring(i):
obj = {}
for j in call(i):
obj['number'] = j
yield obj
result = []
for k in ring(5):
print(k) if k['number'] != 5 else print(k,'\n')
result.append(k)
[print(x) for x in result]
# - OUTPUT -
#
#{'number': 1}
#{'number': 2}
#{'number': 3}
#{'number': 4}
#{'number': 5}
#
#{'number': 5}
#{'number': 5}
#{'number': 5}
#{'number': 5}
#{'number': 5}
我想我明白这里发生了什么。但我不知道如何绕过它,我真的需要具有正确值的列表。
提前致谢:-)
【问题讨论】:
-
ring每次都会产生相同的obj对象;不是副本。也许只是yield {'number': j}?如果需要新对象,则需要创建 newt 对象。 -
顺便说一句,不要对副作用使用列表推导:
[print(x) for x in result] -
哈哈——这将是我的新座右铭不要使用列表理解来产生副作用我刚刚去阅读它,我通过将 obj 移动到循环中解决了我的问题。这样我就可以说从等式中消除了副作用:-)
标签: python memory generator yield