python中列表(list)的操作及注意事项

【遇到的坑】

直接使用'='使两个list相等,即:b=a,则改变a的同时,b也会改变

>>> a = [1, 2, 3]

>>> b = a

>>> print b

[1, 2, 3]

>>> a[0] = 0

>>> print b

[0, 2, 3]    

解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变


※为避免这种情况,有两种方法可避免。

1. 利用列表切片 A = B[:]

2. 深拷贝 A = copy.deepcopy(B)

其中切片的使用举例:

>>> b = a[:]

>>> a[0] = 0

>>> print b

[1, 2, 3]

解释:切片a[:]会产生一个新的对象,占用一块新的内存,b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b


列表深拷贝和浅拷贝

浅拷贝

>>> import copy

>>> a = [1, 2, 3, [5, 6]]

>>> b = copy.copy(a)

>>> print b

[1, 2, 3, [5, 6]]

>>> a[3].append('c')

>>> print b

[1, 2, 3, [5, 6, 'c']]  

深拷贝

>>> a = [1, 2, 3, [5, 6]]

>>> b = copy.deepcopy(a)

>>> a[3].append('c')

>>> print b

[1, 2, 3, [5, 6]]

深拷贝即是开辟一块新的内存空间,把被拷贝对象中的值复制过去。由于是开辟了一块新空间,所以改变a中[5, 6]的值,并不影响b。

而浅拷贝并没有为子对象[5,6]开辟一块新的内存空间,而仅仅是实现对a中[5,6]的引用。所以改变a中[5,6]的值,b中的值也会发生变化。


※数组赋值不能用切片来达到相同的目的

>>> import numpy as np

>>> a = np.array([1, 2 ,3])

>>> b = a[:]

>>> a[0] = 5

>>> print a, b

[5 2 3] [5 2 3]

如上,虽然用切片,但不能达到修改a而不影响b的目的。说明a,b仍然指向同一块内存。

此时,只能用拷贝

>>> b = a.copy()

>>> a[0] = 5

>>> print a, b

[5 2 3] [1 2 3]

此时修改a不会影响到b。

注意,列表的拷贝是copy.copy(obj)或copy.deepcopy(obj),数组的拷贝是obj.copy()


【1】将字符串转化为list:

(字符串(str)转化为list和tuple,list和tuple之间相互转化)

>>> s = "xxxxx"
>>> list(s)
['x', 'x', 'x', 'x', 'x']
>>> tuple(s)
('x', 'x', 'x', 'x', 'x')
>>> tuple(list(s))
('x', 'x', 'x', 'x', 'x')
>>> list(tuple(s))

['x', 'x', 'x', 'x', 'x']

(将list或者tuple转化为str)

>>> "".join(tuple(s))
'xxxxx'
>>> "".join(list(s))
'xxxxx'
>>> str(tuple(s))
"('x', 'x', 'x', 'x', 'x')"
>>> 

【2】删除列表中的元素

li = [1,2,3,4,5,6]
>>>使用del删除对应下标的元素
del li[2]
>li = [1,2,4,5,6]
>>>使用.pop()删除最后一个元素
li.pop()
>li = [1,2,4,5]
>>>删除指定值的元素(remove后面括号中的内容是list中的具体元素,不是index)
li.remove(4)
>li = [1,2,5]
>>>使用切片来删除
li = li[:-1]
>li = [1,2]
# !!!切忌使用这个方法,如果li被作为参数传入函数,
那么在函数内使用这种删除方法,将不会改变原list
    li = [1,2,3,4,5,6]
def delete(li, index):
     li = li[:index] + li[index+1:]
delete(li, 3)
print li
# 会输出[1,2,3,4,5,6]

参考:https://www.douban.com/note/277146395/

          https://blog.csdn.net/sruru/article/details/7803208

          https://blog.csdn.net/lc_lc2000/article/details/53135839

其他相关操作:http://www.runoob.com/python/python-lists.html

猜你喜欢

转载自blog.csdn.net/shashaqingmuzi/article/details/80239587