簡體   English   中英

Python生成器vs理解並通過引用vs值傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM