在函数中创建不同的对象

Vit*_*ile 3 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[0]['num'] = 4
    print v[1]['num']
Run Code Online (Sandbox Code Playgroud)

我期望得到的最后一行的输出是a 3; 然而它打印出来4.所以它应该意味着始终在相同的参考地址创建新对象.

我该如何避免这种行为?(即如何使上面的代码打印4?)

Pad*_*ham 5

你需要创建两个dicts:

v = [ {},{} ] 
Run Code Online (Sandbox Code Playgroud)

或者使用循环:

v = [ {} for _ in range(2)] 
Run Code Online (Sandbox Code Playgroud)

您正在创建对同一对象的两个引用.

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
Run Code Online (Sandbox Code Playgroud)

  • :-)你怎么设法甚至这么快读这些东西? (2认同)
  • @AmiTavory请注意,每当你看到`[{}]*2`或`[[]*0]时,它就是罪魁祸首 (2认同)
  • @Bhargav Rao不幸的是,我的大脑词法分析器比其他人的字节码编译器慢.:-) (2认同)