为什么是数据污染

  • 本文关键字:数据 污染 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)

I want results:

{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).

在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

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

USERINFO_STRUCT复制到newuser

最新更新