使用字符串更新已使用零值初始化的列表元素 - 是否会创建副本或覆盖?

时间:2014-12-03 16:15:03

标签: python

我的问题一般是关于列表和数据类型。 如果我事先用零初始化列表字典(为了沿程序更新这些值),如下所示:

data = defaultdict(list)

class sLabel:
    TotalTrx = 0
    Week = 1
    Day = 2
    Hour = 3
    POD = 4


def init(sID):    
    for i in [attr for attr in dir(sLabel) if not callable(attr) and not attr.startswith("__")]:
        data[sID].append(0)

我用零更新此列表,但某些元素将使用字符串值更新 我的问题是,这会创建一个副本还是覆盖特定的元素?

第二个问题,如果它确实创建了一个副本,那么用不同的数据类型初始化列表字典的正确和最干净的方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为以下代码段可以回答您的问题:

>>> a = [0, 0, 0] # create list full of zeroes
>>> b = a # create second reference to same list
>>> a[1] = "foo" # replace one int with string
>>> a
[0, 'foo', 0] # definitely changed a
>>> b
[0, 'foo', 0] # b also changed, so still referencing same object
>>> a is b
True # yes, definitely still the same object

列表是可变的,它们可以就地更改。它们持有对象的引用,因此放入列表中的对象类型无关紧要(列表的实际大小仅反映其中的对象数,而不是基础大小那些对象)。

如果要创建副本,则必须明确(例如b = a[:])。