python中的内存问题

python中的内存问题,python,memory,generator,yield,Python,Memory,Generator,Yield,我有一个问题->我想产生信息并将其放入类似的对象中。但是当我把结果附加到一个列表中时,我想所有的东西都指向内存中的同一个地址 def调用(i): 对于范围(i)中的j: 产量j+1 def环(一): obj={} 对于j in call(i): obj['number']=j 产量目标 结果=[] 对于环(5)中的k: 如果k[‘数字’]!=5其他打印(k,“\n”) 结果追加(k) [结果中x的打印(x)] #-输出- # #{'number':1} #{'number':2} #{'numb

我有一个问题->我想产生信息并将其放入类似的对象中。但是当我把结果附加到一个列表中时,我想所有的东西都指向内存中的同一个地址

def调用(i):
对于范围(i)中的j:
产量j+1
def环(一):
obj={}
对于j in call(i):
obj['number']=j
产量目标
结果=[]
对于环(5)中的k:
如果k[‘数字’]!=5其他打印(k,“\n”)
结果追加(k)
[结果中x的打印(x)]
#-输出-
#
#{'number':1}
#{'number':2}
#{'number':3}
#{'number':4}
#{'number':5}
#
#{'number':5}
#{'number':5}
#{'number':5}
#{'number':5}
#{'number':5}
我想我知道这里发生了什么。但我不知道如何避开它,我真的需要有正确值的列表


提前感谢:-)

哇。。。你用的是错误的产量。。。为什么在列表中保存时使用收益率。。。您放弃列表,然后放弃

def call(i):
    for j in range(i):
        yield j+1

def ring(i):
#you define obj here
    obj = {}
    for j in call(i):
        # if you want a different object each time instance here
        # or use obj[j] = j
        obj = {}
         
        obj['number'] = j
        # yield stop execution of this function and on next iteration continue from where it's left ... your return obj which is a reference to a dict
        yield obj
    
result = []
for k in ring(5):
    # print always puts \n after each call
    print(k) if k['number'] != 5 else print(f"{k} is 5",'\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}
我不知道您是否了解C,但简化后的代码如下所示:

int* x = new int[10]
other* dict = new other
for (i=0;i<5;i++)
   dict.other = i
   x[i] = dict
int*x=新的int[10]
其他*dict=新的其他

对于(i=0;i
ring
每次生成相同的
obj
对象;不是副本。可能只是
生成{'number':j}
?如果您想要新对象,您需要创建新对象。另外,不要使用列表理解来产生副作用:
[打印(x)结果中的x]
Haha-这将是我的新座右铭不要使用列表理解法来处理副作用我刚去读过这篇文章,我通过将obj移动到循环中解决了我的问题。这样我就可以说从等式中去除了副作用:-)谢谢。我懂一点C,所以我理解你的例子。这是我第一次用收益率做任何事情。但在我看来,我似乎也在使用它,而不是附加到列表并返回列表。但也许它能提供比我想象的更多的东西:)我会在我的学习道路上找到答案,再次感谢你的回答!:)
for (i=0;i<5;i++)
   other* dict = new other
   dict.other = i
   x[i] = dict