我在Python中已经注意到一种我想要理解的现象,但我不知道用什么词来描述它或找到文档。
比较以下序列:
1)
a = ['my', 'nice', 'new', 'list']
a.reverse()
print(a)
>>> ['list', 'new', 'nice', 'my']
2)
b = 'my nice new string'
b.swapcase()
print(b)
>>> 'my nice new string'
为什么是这样,对于第二个序列,为了让印刷品给出“我好新的字符串”,我必须写
b = b.swapcase()
print(b)
?或者相反,为什么DON'在第一个序列中打印(a)之前必须写一个= a.reverse()?为什么需要将其中一些方法明确地分配给变量而将其他方法隐式存储在它们所使用的变量中的原因是什么?
答案 0 :(得分:2)
某些功能会修改列表,有些会返回修改后的版本。例如,.reversed()
而不是.reverse()
将返回反向排序列表,而不是修改列表本身。对于可变对象,例如列表,dicts等,您可以选择修改对象本身。
由于字符串是不可变的,因此您不能使.swapcase()
版本修改原始字符串:
https://docs.python.org/2/reference/datamodel.html
值可以改变的对象被认为是可变的;对象的 一旦创建它们,值就不可更改,称为不可变。 (该 包含对a的引用的不可变容器对象的值 当后者的值改变时,可变对象可以改变;然而 容器仍然被认为是不可变的,因为收集了 它包含的对象无法更改。所以,不变性不是 与具有不可改变的值严格相同,它更加微妙。) 对象的可变性由其类型决定;例如, 数字,字符串和元组是不可变的,而词典和 列表是可变的。
答案 1 :(得分:0)
该列表是可变数据结构的引用变量。调用它的typedef unique_ptr<_Ty> _Myt;
_Myt& operator=(_Myt&& _Right) _NOEXCEPT
{ // assign by moving _Right
if (this != &_Right)
{ // different, do the move
reset(_Right.release());
this->get_deleter() = _STD forward<_Dx>(_Right.get_deleter());
}
return (*this);
}
void reset(pointer _Ptr = pointer()) _NOEXCEPT
{ // establish new pointer
pointer _Old = get();
this->_Myptr() = _Ptr;
if (_Old != pointer())
this->get_deleter()(_Old);
}
方法可以反转列表&#34;就位#34;。
reverse
方法返回一个新字符串,因为字符串在Python中是不可变的