python operator" *"有了List,还有其他类似的吗?

时间:2016-03-21 05:19:43

标签: python list

使用*创建列表时:

>>> ll = [None] * 3
>>> ll
[None, None, None]
>>> ll[0] = 2
>>> ll
[2, None, None]

然后使用二维,

>>> ll2 = 3 *[ 3 * [None]]
>>> ll2
[[None, None, None], [None, None, None], [None, None, None]]
>>> ll2[0][0] = 2
>>> ll2
[[2, None, None], [2, None, None], [2, None, None]]

因此,如果元素是像list这样的对象,则按运算符*创建列表。它不会创建新对象,只需使用引用的对象。

Python中还有其他类似的操作符吗?

编辑:

抱歉,我的陈述很糟糕。我想知道的是,有没有其他运营商使用类似" *"不会创建多个引用。

4 个答案:

答案 0 :(得分:5)

如果您将列表列表相乘,它将创建内部列表的多个引用。

>>> lst = 3 * [3 * [None]]
>>> lst[0] is lst[1]
True
>>> lst[0] is lst[2]
True

您需要创建单独的列表。例如,使用列表理解:

>>> lst = [3 * [None] for i in range(3)]
>>> lst[0][0] = 2
>>> lst
[[2, None, None], [None, None, None], [None, None, None]]

答案 1 :(得分:1)

这与*运算符无关,但事实上您使用的是list[3 * [None]]创建一个列表对象,并在ll2中存储3个对此列表的引用的列表。如果更改其中一个引用的列表,则也会更改所有其他列表。所有mutable objects

都会发生此行为

答案 2 :(得分:0)

这与使用*运算符乘以列表无关。赋值是通过引用或换句话说l是可变别名。为了证明这一点,以下代码将做同样的事情。

l = [None, None, None]
l12 = [l, l, l]
print l12
>>> [[None, None, None], [None, None, None], [None, None, None]]
l[0]=2
print l12
>>> [[2, None, None], [2, None, None], [2, None, None]]

答案 3 :(得分:0)

列表理解

>>> ll=[[None for r in range(3)] for k in range(3)]
>>> ll[0][0]=3
>>> ll
[[3, None, None], [None, None, None], [None, None, None]]