使用*创建列表时:
>>> 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中还有其他类似的操作符吗?
抱歉,我的陈述很糟糕。我想知道的是,有没有其他运营商使用类似" *"不会创建多个引用。
答案 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]]