无法使用包faker生成

时间:2018-03-05 15:34:58

标签: python

我在生成假城市时遇到了一些问题,而不仅仅是城市。

from faker import Faker
from collections import defaultdict
import pprint

fake = Faker('en_US')
pp = pprint.PrettyPrinter(indent=4)

user_details = defaultdict(dict)
list_user_details = []

for i in range(0, 3):
    user_details["first_name"] = fake.first_name()
    user_details["address"]["city"] = fake.city()
    list_user_details.append(user_details.copy())

pp.pprint(list_user_details)

输出:

[   defaultdict(<class 'dict'>,
                {   'address': {'city': 'Alanbury'},
                    'first_name': 'Jennifer'}),
    defaultdict(<class 'dict'>,
                {   'address': {'city': 'Alanbury'},
                    'first_name': 'Bobby'}),
    defaultdict(<class 'dict'>,
                {   'address': {'city': 'Alanbury'},
                    'first_name': 'Christopher'})]

问题在于我无法接收不同的城市。但我对first_name没有问题,例如

1 个答案:

答案 0 :(得分:0)

问题是地址是dict(可变),而first_name是一个字符串(不可变)。

当您复制包含可变类型的字典(如另一个字典或列表)时,默认情况下会创建副本,这意味着您实际上只有一个字母可以覆盖,因此你看到这里,不可变数据类型没有这个问题。在这种情况下,您必须使用 deepcopy 。有关详细信息:https://docs.python.org/3.6/library/copy.html

但是在你的情况下使用深度复制会让你的代码变得不必要,我想你可以写这个。

for _ in range(3):
    user_details = { "address": { "city": fake.city() }, "first_name": fake.first_name() }
    list_user_details.append( user_details )