【问题标题】:Python3 list filled with empty dict用空字典填充的 Python3 列表
【发布时间】:2019-10-03 06:10:04
【问题描述】:

我找到了way 来创建一个列表,其中包含相同的文字。

所以我做了以下操作:

my_list_of_dict = [{}] * 3

my_list_of_dict[0][0] = 1
my_list_of_dict[0][1] = 2

print(my_list_of_dict)
# What I thought : [{0: 1, 1: 2}, {}, {}]
# What actually happened : [{0: 1, 1: 2}, {0: 1, 1: 2}, {0: 1, 1: 2}]

这是一个错误吗?还是预期的功能?

似乎python不会每次都初始化新的dict,而只是将给定的dict分配给列表。

另外,我该如何call(pronouce) [] * n?这是一种列表理解吗?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    {} 返回对 dict 的引用,然后通过 *3,您对同一 dict 进行了 3 次引用。 要解决此问题,请使用不同的方法:

    [{} for _ in range(3)]
    

    zeros (0) 没关系,因为它们是不可变的,所以一旦你修改了列表中的值,你就“创建”了一个新数字,然后通过列表引用它:

    >>> l = [0]*3
    >>> [id(x) for x in l]
    [10910368, 10910368, 10910368]
    >>> l[0] = 10
    >>> [id(x) for x in l]
    [10910688, 10910368, 10910368]
    

    但是对于可变对象,您正在修改直接引用的对象,因此列表中的所有位置都知道这种变化,因为它们指向同一个对象:

    >>> l = [[]]*3
    >>> l
    [[], [], []]
    >>> l[0].append(10)
    >>> l
    [[10], [10], [10]]
    >>> [id(x) for x in l]
    [139858640463368, 139858640463368, 139858640463368]
    

    通过使用其他推导,您将在推导的每个循环中创建一个 new 实例:

    >>> l = [{} for _ in range(3)]
    >>> l[0]["foo"] = 10
    >>> l
    [{'foo': 10}, {}, {}]
    

    【讨论】:

    • 知道了!非常感谢,我能知道我怎么说[] * n 吗?列出乘法?列表理解?列表构造?
    • @Jerry,我不记得怎么称呼了,对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多