python3中列表方法无返回值问题

python编程中遇到过列表操作无返回值的情况,如今趁着温习,记录一下。

简单的来说除了count、index、copy、pop外其他的方法都没有返回值,而且特别强调的是,copy返回的是该列表的值(若将该返回值复制给另外一个变量,则效果是对原列表的一个浅复制,即新的变量完成了对原列表的引用。python3中已经列表和字典的copy方法已经不存在浅复制的问题了,通过实践验证,采用copy得到的副本和原件之间不存在相互影响的问题),pop则是唯一的一个既原地修改原列表又能返回值的方法。

列表和字典的浅复制到底是什么意思呢?比如说

>>> x=[1,2,[1,2,3]]
>>> y=x.copy()
>>> id(x)
2397212213640
>>> id(y)
2397212127560
>>> x is y
False
>>> x[0] is y[0]
True
>>> x[1] is y[1]
True
>>> x[2] is y[2]
True
至此看出了列表和字典作为容器的特性,虽然浅复制后x、不是同一个对象,但是容器内的对象是相同的
>>> y[2].append(100)
>>> y
[1, 2, [1, 2, 3, 100]]
>>> x
[1, 2, [1, 2, 3, 100]]

 也就是说,浅复制虽然得到了新的容器,但是容器内的对象则还是原容器内的对象,也就是说新容器内的对象实际上是原容器内对应对象的引用。若对该对象是不可变对象则无影响,若该对象也是一个容器,那么对这个对象的改变则是会扩散到的,从而影响到源容器内的对应对象。

>>> a=[1,2,3]
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
 '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', 
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__',
 '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy',
 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> a.append(4)     #执行完屏幕上啥也没有,说明没有返回值
>>> a.extend('safa')     #执行完屏幕上啥也没有,说明没有返回值
>>> a.count('a')      #有返回值,表示对象最为列表成员出现的次数,即通过一次索引即可找到该元素,这种元素出现的次数
2
>>> a.index(3)       #返回列表中第一个该元素出现的索引位置
2
>>> a.index('a')
5
>>> a.index('a',6)    #也可指定查找范围,结束位置可省
7
>>> a.insert(3,"nihao')
  File "<stdin>", line 1
    a.insert(3,"nihao')
                      ^
SyntaxError: EOL while scanning string literal
>>> a.insert(3,"nihao")    #执行完屏幕上啥也没有,说明没有返回值
>>> a.remove('a')      #执行完屏幕上啥也没有,说明没有返回值
>>> a.reverse()      #执行完屏幕上啥也没有,说明没有返回值
>>> a.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'
>>> a
['a', 'f', 's', 4, 'nihao', 3, 2, 1]
>>> a.pop('nihao')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>> a.remove('nihao')
>>> a.pop(0)   返回并删除指定位置的元素,缺省则默认为列表尾部
'a'
>>> a.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'
>>> a.clear()     #执行完屏幕上啥也没有,说明没有返回值


猜你喜欢

转载自blog.csdn.net/Muyan_Donny/article/details/81745421