[英]Python generator vs comprehension and pass by reference vs value
我有一些代碼遍歷字符串,並從該字符串生成對象列表,這就是我稱為實例的代碼。 看起來像這樣。
from collections import defaultdict
class MyInstance:
data = defaultdict(str)
def __init__(self, data, parser):
# parse the input
self.parser = parser
class MyParser:
def __init__(self, data):
self.data = data
data = data.split('\n\n')
self.instances = (MyInstance(instance, self) for instance in data)
mydata = # ... coming in from stdin or file
parser = MyParser(mydata)
一切正常,但是后來我意識到我需要多次檢查實例。 所以,我想我只是將生成器更改為列表理解:
self.instances = [MyInstance(instance, self) for instance in data]
這使我可以根據需要多次迭代實例,但是突然之間,所有實例都相同。 當我在這一行之前打印數據時,每個實例都是唯一的。 但是,在理解列表之后,它們都是相同的。
class MyParser:
def __init__(self, data):
self.data = data
data = data.split('\n\n')
print data
self.instances = (MyInstance(instance, self) for instance in data)
print list(self.instances)
打印...
['the soldier sleeps', 'the big soldier sleeps', 'the big wonderful soldier sleeps']
['the big wonderful soldier sleeps', 'the big wonderful soldier sleeps', 'the big wonderful soldier sleeps']
但是,最奇怪的部分是,當我嘗試使用與上述類似的代碼來重新創建此問題時, 我無法復制它 :
class myClass:
def __init__(self, i):
self.i = i
def __repr__(self):
return self.__str__()
def __str__(self):
return str(self.i)
instances = [myClass(i) for i in range(3)]
print instances
instances = (myClass(i) for i in range(3))
print list(instances)
打印...
[0, 1, 2]
[0, 1, 2]
我檢查了每個實例(在損壞的代碼中)的內存地址是否相同或不同,並且看起來它們是不同的……(盡管我承認我不確定這是否意味着什么)
for i in self.instances:
print id(i) # 4463026760, 4463026544, 4463026616
所以,我不知道發生了什么。 關於這些實例為何似乎聯系在一起的任何建議?
看來問題與我如何初始化數據有關。 我正在初始化defaultdict作為該類的成員:
class myClass:
self.data = defaultdict(str)
def __init__(self, data):
for i, instance in enumerate(data.split('\n')):
# Do something...
self.data[i] = instance
我將其更改為:
class myClass:
def __init__(self, data):
self.data = defaultdict(str)
for i, instance in enumerate(data.split('\n')):
# Do something...
self.data[i] = instance
這解決了我的問題。 如果有人知道為什么會很感興趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.