簡體   English   中英

'self'隱式更改Python迭代中的先前數據項

[英]'self' implicit change previous data item in Python iteration

我有一個關於在Python中使用變量的問題。 請看下面的例子:

from copy import deepcopy
class IntClass:
    props = {}
    def __init__(self, keys, values):
        indx = 0
        for key in keys:
            self.props[key] = values[indx]
            indx += 1
def display(self):
    for key in self.props.keys():
        print 'key=%s value=%s' %(key,self.props[key])

class IntGen:
    def gen(self, keys, values):
        for vs in values:
            yield [keys, vs]

    def start(self, keys, values):
        self.loader = self.gen(keys, values)

    def nextItem(self):
        return self.loader.next()

keys = ['k1', 'k2', 'k3']
values = [['v1.1', 'v1.2', 'v1.3'], ['v2.1', 'v2.2', 'v2.3'], ['v3.1', 'v3.2', 'v3.3']]

holder = []
intGen = IntGen()
intGen.start(keys, values)
while True:
    try:
        a = intGen.nextItem()
        holder.append(deepcopy(IntClass(a[0],a[1])))
    except StopIteration:
        break

for h in holder:
    h.display()

根據我的理解,結果應該是:

key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v2.3
key=k2 value=v2.2
key=k1 value=v2.1
key=k3 value=v1.3
key=k2 value=v1.2
key=k1 value=v1.1

但是,我得到的是如下:

key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1
key=k3 value=v3.3
key=k2 value=v3.2
key=k1 value=v3.1

在我看來,在While循環中,當我嘗試創建一個新的IntClass實例時, 該新實例修改了存儲在前一循環中創建的實例的props屬性中的值 ,最后,導致持有者包含所有具有相同數據的實例。

任何人都可以指出我的答案? 看起來變量有問題,但我對如何解決它沒有任何影響。

非常感謝,

您將行props = {}直接放在類定義中。 這將導致類的所有實例共享相同的字典。

如果您希望每個實例都有自己的字典,請在__init__ self.props = {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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