当列表更新时,为什么由列表元素组成的元组会发生变化

时间:2015-06-12 19:53:26

标签: python

我知道元组是不可变的。但是我不明白为什么元组值在以下代码中会发生变化。我正在运行python 2.7

var someDiv = document.getElementsByTagName('div');

for(var i=0;i<someDiv.length;i++){
    var text = someDiv[i].innerText.trim(); //kick out all the space with no utility
    if(text.length<=0){
        someDiv[i].style.display = 'none';
    }
}

我期待my_tuple是'([3,4],[3,4])',而不是([3,4,20],[3,4,20])

2 个答案:

答案 0 :(得分:4)

元组是不可变的。这并不意味着他们的内容必然是不可改变的。元组没有&#34;冻结&#34;你投入的任何内容的副本;它只是持有对象的引用。如果你的元组包含可变对象,你可以像往常一样改变它们。

答案 1 :(得分:4)

元组不可变但元组内的列表可变

您不能向元组添加新对象,但如果它们是可变的,您可以添加到元组内的对象。你没有改变你正在改变元组中存储的元素的元组。

如果你试图实际改变元组本身,你会收到一个错误:

In [12]: k = [3,4]   
In [13]: my_tuple = (k,k)    
In [14]: my_tuple[0] = [1,2,3] 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-c170b930bb12> in <module>()
----> 1 my_tuple[0] = [1,2,3]

TypeError: 'tuple' object does not support item assignment

当你追加到列表时,你没有改变元组所持有的对象,你只是在改变一个可变对象:

In [15]: id(my_tuple[0])
Out[15]: 140625164882288  
In [16]: my_tuple[0].append(20)    
In [17]: id(my_tuple[0])
Out[17]: 140625164882288