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,我从巴格夫·拉奥大师那里学到了我所知道的一切;)@巴加夫罗,我不知道,有人告诉我,我有一张声调十足的脸;)