附加到python dict中的数组会附加到所有数组

时间:2017-01-25 08:40:34

标签: python python-3.x dictionary

我有以下代码:

<?php
$sql = "SELECT MAX(timestamp_pole) as last_pole FROM pole WHERE id_group = ". $id_grup;
$resultado = $mysqli->query($sql);
$resultado = $resultado->fetch_assoc();
$las_00 = date('Y-m-d');
$las_00 = strtotime($las_00);
if ($resultado['last_pole'] >= $las_00){
} else {
    $sql = "INSERT INTO pole (timestamp_pole, id_user, id_group) VALUES (". $timestamp .",". $user['id'] .",". $id_group .")";
    $mysqli->query($sql);
    //return addslashes($sql);
    if (isset($user['username']))
        return "@". $user['username'] ." pole!";
    else 
        return $user['name'] ." pole!";
}
?>

输出

a_dict = dict.fromkeys(['a', 'b', 'c'], [])  
a_dict['a'].append(1)  
print(a_dict)  

为什么1被附加到所有数组而不是仅有`{'a': [1], 'c': [1], 'b': [1]}` 的数组?如果我只想附加密钥a的那个,我该怎么做?

3 个答案:

答案 0 :(得分:1)

fromkeys()方法返回一个新字典,其中给定的元素序列作为字典的键。

如果设置了value参数,则新创建的字典的每个元素都将设置为提供的值。

如果提供的值是可变对象(其值可以修改),如list,dictionary等,则修改可变对象时,序列的每个元素也会更新。

这是因为,每个元素都被赋予对同一个对象的引用(指向内存中的同一个对象)。

答案 1 :(得分:0)

啊哈,似乎dict.fromkeys只生成一个值的副本,并返回一个指向它的指针。如果它被初始化为a_dict = {&#39; a&#39;:[],&#39; b&#39;:[],&#39; c&#39;:[]}那么代码按预期工作。

知道了这一点后,在dict.fromkeys all point to same list

找到了副本

答案在那里提出:
    yet_another_dict = {key:[]表示[&#39; a&#39;,&#39; b&#39;,&#39; c&#39;]}

答案 2 :(得分:0)

a_dict = dict.fromkeys(['a', 'b', 'c'], [])

这会创建一个包含键'a','b','c'的字典,并为每个键创建值[]

这里的问题是每个键指向相同的值:内存中相同的空dict实例[]

a_dict['a']a_dict['b']不仅仅是平等的(同等地评估),它们是完全相同的实例。您创建的字典有三个键,每个键的值是指向同一个空字典实例的指针。

您可以查看:

a_dict['a'] == a_dict['b']
# Returns True: both are equal
a_dict['a'] is a_dict['b']
# Also returns True: both are the same instance

因此,修改a_dict['a']会修改该共享dict实例并影响a_dict['b']