在 python 中产生内存问题
yield memory issues in python
我有问题 -> 我想生成信息并将其放入类似的对象中。但似乎当我将结果附加到列表时,所有内容都指向内存中的相同地址,我想。
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}
我想我明白这里发生了什么。但我不知道如何绕过它,我真的需要具有正确值的列表。
提前致谢:-)
哇...您使用的 yield 是错误的...为什么在保存列表时使用 yield? ...你作为列表屈服并在那之后丢弃
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
虽然我的代码看起来像:
整数* x = 新整数[10]
for (i=0;i<5;i++)
other* dict = new other
dict.other = i
x[i] = dict
我有问题 -> 我想生成信息并将其放入类似的对象中。但似乎当我将结果附加到列表时,所有内容都指向内存中的相同地址,我想。
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}
我想我明白这里发生了什么。但我不知道如何绕过它,我真的需要具有正确值的列表。
提前致谢:-)
哇...您使用的 yield 是错误的...为什么在保存列表时使用 yield? ...你作为列表屈服并在那之后丢弃
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
虽然我的代码看起来像: 整数* x = 新整数[10]
for (i=0;i<5;i++)
other* dict = new other
dict.other = i
x[i] = dict