为何数据污染?

时间:2016-11-12 07:11:53

标签: python

# -*- coding: utf-8 -*-

import random, pprint
user = {}
USERINFO_STRUCT = {
    'id': '',
}

def client_new(id):
    global user

    newuser = USERINFO_STRUCT
    newuser['id'] = id
    user[id] = newuser

    pprint.pprint(user)
    print ""

client_new(1)
client_new(2)
client_new(3)

我想要结果:

{1: {'id': 1}}

{1: {'id': 1}, 2: {'id': 2}}

{1: {'id': 1}, 2: {'id': 2}, 3: {'id': 3}}

该代码执行的结果是:

{1: {'id': 1}}

{1: {'id': 2}, 2: {'id': 2}}

{1: {'id': 3}, 2: {'id': 3}, 3: {'id': 3}}

你是怎么做到的?

我的机器是Debian Linux 8.6(Python 2.7.9)。

1 个答案:

答案 0 :(得分:4)

在python中,字典和列表通过引用复制:

>>> a = [0]
>>> b = a
>>> b
[0]
>>> a
[0]
>>> b[0] = 2
>>> a
[2]
>>> b
[2]

因此,ba引用python内存中的相同列表,修改一个修改另一个。

因此,您可以做的是当您想要创建列表或字典的另一个副本时,进行复制。列表:

>>> b = a[:]  # for a list

字典:

>>> b = a.copy()  # for a dictionary

因此,在您的代码中,您需要的是使用USERINFO_STRUCTnewuser复制到newuser = USERINFO_STRUCT.copy()