我对Python中 self 变量的使用有疑问。请看以下示例:
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属性中的值 ,最后,导致持有者包含具有相同数据的所有实例。
任何人都能指出我的答案吗?看起来像 self 变量有问题,但我对如何修复它没有任何影响。
非常感谢,
答案 0 :(得分:2)
您将行props = {}
直接放在类定义中。这将导致类的所有实例共享相同的字典。
如果您希望每个实例都有自己的字典,请将self.props = {}
放在__init__
中。