Python 在函数中创建不同的对象
请查看以下代码段:Python 在函数中创建不同的对象,python,Python,请查看以下代码段: class MyObj(object): name = "" def __init__(self, name): self.name = name v = [ {} ] * 2 def f(index): v[index]['surface'] = MyObj('test') v[index]['num'] = 3 if __name__ == '__main__': f(0) f(1) v[
class MyObj(object):
name = ""
def __init__(self, name):
self.name = name
v = [ {} ] * 2
def f(index):
v[index]['surface'] = MyObj('test')
v[index]['num'] = 3
if __name__ == '__main__':
f(0)
f(1)
v[0]['num'] = 4
print v[1]['num']
最后一行的输出是一个3
;但是,它会打印出4
。因此,这意味着新对象总是在相同的引用地址创建
我怎样才能避免这种行为?(即如何打印上述代码4?)您需要创建两个DICT:
v = [ {},{} ]
或者使用循环:
v = [ {} for _ in range(2)]
您正在创建对同一对象的两个引用
In [2]: a = [{}] * 2
In [3]: id(a[0])
Out[3]: 140209195751176
In [4]: id(a[1])
Out[4]: 140209195751176
In [5]: a[0] is a[1]
Out[5]: True
In [6]: a = [{} for _ in range(2)]
In [7]: id(a[1])
Out[7]: 140209198435720
In [8]: id(a[0])
Out[8]: 140209213918728
In [9]: a[0] is a[1]
Out[9]: False
推荐一个近dupe@AmiTavory请注意,每当您看到
[{}]*2
或[[[]*0]
时,它都是culprit@BhargavRao不幸的是,我大脑的lexer比其他人的字节码编译器慢。:-)@AmiTavory您最好将这个答案编译成一个pyc
文件,并将其存储在您的持久存储器中P@AmiTavory,我从巴格夫·拉奥大师那里学到了我所知道的一切;)@巴加夫罗,我不知道,有人告诉我,我有一张声调十足的脸;)