menu

Junjielee Blog

在平凡中坚持前行,总会遇见不凡的自己

Python_list脚本操作语法

python 的 list 操作符号有两个 + , *

其中 + 操作相当于extend,如listA + listB 就是将listB的所有元素追加到listA里面:

In [28]: [1,"a",{"a": 1}] + ["b"]
Out[28]: [1, 'a', {'a': 1}, 'b']

其次就是 * 操作,相当于复制操作,复制list里面的元素,如:

In [30]: a = ["Hi", 1, 1.2] * 2

In [31]: a
Out[31]: ['Hi', 1, 1.2, 'Hi', 1, 1.2]

In [32]: a[2] = 1.4

In [33]: a
Out[33]: ['Hi', 1, 1.4, 'Hi', 1, 1.2]

In [34]: a[0] = 1.1

In [35]: a
Out[35]: [1.1, 1, 1.4, 'Hi', 1, 1.2]

从上面的例子可以看出,数字,字符串等不可变对象的复制,对应的值修改后,复制出来的值也不会变,而可变对象则不同,由于复制只是复制引用变量(一切皆对象),所以复制出来的只是指向对象的引用,下面的例子有:list对象,dict对象,class对象。

In [46]: b = [[]] * 2

In [47]: b[0].append(1)

In [48]: b
Out[48]: [[1], [1]]

In [51]: c
Out[51]: [{}, {}]

In [52]: c[0]["a"] = 1

In [53]: c
Out[53]: [{'a': 1}, {'a': 1}]

In [54]: class A(object):
   ....:     b = 1
   ....:

In [55]: a = A()

In [56]: z = [a] * 2

In [57]: a
Out[57]: <__main__.A at 0x10f5b6590>

In [58]: z
Out[58]: [<__main__.A at 0x10f5b6590>, <__main__.A at 0x10f5b6590>]

In [59]: z[0]
Out[59]: <__main__.A at 0x10f5b6590>

In [60]: z[0].b
Out[60]: 1

In [61]: z[0].b = 2

In [62]: z[1].b
Out[62]: 2

而将它的复制值直接复制给另外一个对象,而不是对复制值进行操作,所以下面的例子就没有共享内存的对象了(这里的复制值意思就是:[a, b]* 2 => [a,b,a1,b2],这里的a,a1就是复制值,不能理解的直接看例子吧)

In [36]: b = [[]] * 2

In [37]: b
Out[37]: [[], []]

In [38]: b[0] = "Hi"

In [39]: b
Out[39]: ['Hi', []]

In [40]: b = [[]] * 2

In [41]: b[0] = ["Hi"]

In [42]: b
Out[42]: [['Hi'], []]