【问题标题】:Python remove method mute the dictionary keysPython remove 方法使字典键静音
【发布时间】:2015-06-13 03:06:44
【问题描述】:

我想使用一个字典来表示具有一定数量的节点(num)和所有可能的边(输出)的有向图。

例子:

如果 num = 1,输出:{0: set([])}

如果 num = 2,输出:{0: set([1]), 1: set([0])}

如果 num = 3,输出:{0: set([1,2]), 1: set([0,2]), 2: set([0,1])}

如果 num = 4,输出:{0: set([1,2,3]), 1: set([0,2,3]), 2: set([0,1,3]), 3:设置([0,1,2])}

我的代码将遍历字典并通过从温和列表中删除键来创建每个集合:

num = 3
keys = range(0,num)
mydict ={} 
for key in keys:
    temp = keys
    value_list = temp.remove(key)
    mydict[key] = set([value_list])

但似乎通过使用 temp.remove(key),不仅临时而且键都会被静音。这是为什么呢?

【问题讨论】:

    标签: list dictionary


    【解决方案1】:

    您在 Python 中使用的大多数对象(不是像 int 这样的原语)只是对实际数据的引用。这意味着在您的示例中, temp 和 keys 都是引用相同数据的指针。

    keys = range(0,num)                # Bind keys to a new list instance = [0, 1, 2, ..., num]
    mydict = {} 
    for key in keys:
        temp = keys                    # Bind temp to the same dictionary as keys
        value_list = temp.remove(key)  # Remove from the list temp and keys point to
        ...
    

    如果你想让 temp 指向一个唯一的列表,有几种方法可以做到,但我更喜欢这样的方法:

    temp = list(keys)
    

    编辑: 根据 cryo 的the analysis done here,这种奇怪的语法稍微快一些(称为切片)

    temp = list[:]
    

    【讨论】:

    • 很高兴听到这个消息!我不确定您是否收到通知,但我稍微编辑了我的答案。事实证明,有一种稍微快一点的方法可以做你想做的事情。祝你好运!
    • 谢谢。我现在看到了新的更新语法。另外,我不明白“您在 Python 中使用的大多数对象(不是 int 之类的原语)只是对实际数据的引用”,尽管您的解决方案有助于克服这个问题。您能否在这方面进行更多扩展?
    • 没问题!基本上,由于整数是单条数据,它们可以存储在单个内存地址中。另一方面,数组需要很多内存地址。通常,出于一些更深入的内存分配原因,该内存地址保存另一个地址,而不是一段数据。该地址指向实际数组的开头。出于这个原因,当您设置 temp = list 时,您实际上所做的是将 temp 设置为与 list 相同的指针,该指针指向数组本身。如果该解释过于紧凑/令人困惑,谷歌搜索“指针”可能会有所帮助:)
    • A = [1,2] B = A B = [1,2,3] B.remove(1) A 仍然是 [1,2]。列表 A 似乎不会更改。
    • 正确,它不会——在这种情况下,B 和 A 在 B = A 之后立即指向同一个位置,但是当您执行 B = [1, 2, 3] 时,您会创建一个新列表并且 B 并且只有 B 被设置为包含指向该列表的指针。
    猜你喜欢
    • 2020-02-21
    • 2014-05-15
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多