Python 中多个空列表的初始化
Initialization of multiple empty lists in Python
在Python3中将一堆变量初始化为独立空列表的正确方法是什么?
>>> (a, b) = ([],)*2
>>> a.append([2,3])
>>> a
[[2, 3]]
>>> b
[[2, 3]]
>>> b.append([2,3,])
>>> b
[[2, 3], [2, 3]]
>>> a
[[2, 3], [2, 3]]
>>> (a, b) = ([] for _ in range(2))
>>> a.append([2,3])
>>> a
[[2, 3]]
>>> b
[]
>>> b.append([2])
>>> b
[[2]]
>>> a
[[2, 3]]
为什么第一次尝试没有在内存中独立分配a
、b
?
您可以按如下方式初始化它们。
a = b = []
a = [2]
b = [2, 3]
print(a, b)
为什么第一次尝试没有在内存中独立分配a,b?因为它们在内存中引用相同的地址。
(a, b) = ([],)*2
print(id(a))
print(id(b))
# 4346159296
# 4346159296
(a, b) = ([] for _ in range(2))
print(id(a))
print(id(b))
# 4341571776
# 4341914304
Why the first attempt does not allocate a, b independently in memory?
因为您使用同一个列表来定义多个变量。它是这样的:
list1 = []
var1, var2 = list1, list1
在你的第二种情况下,你使用的是每次迭代都会创建新列表的理解。
你可以看看这个例子
list1 = [1, 2, 3]
a = [val for val in list1]
b = [val for val in list1]
c, d = ([list1]) * 2
print(f"{a=}")
print(f"{b=}")
print(f"{c=}")
print(f"{d=}")
print("Append something")
a.append("a append")
list1.append("list1 append")
print(f"{a=}")
print(f"{b=}")
print(f"{c=}")
print(f"{d=}")
输出:
a=[1, 2, 3]
b=[1, 2, 3]
c=[1, 2, 3]
d=[1, 2, 3]
Append something
a=[1, 2, 3, 'a append']
b=[1, 2, 3]
c=[1, 2, 3, 'list1 append']
d=[1, 2, 3, 'list1 append']
在Python3中将一堆变量初始化为独立空列表的正确方法是什么?
>>> (a, b) = ([],)*2
>>> a.append([2,3])
>>> a
[[2, 3]]
>>> b
[[2, 3]]
>>> b.append([2,3,])
>>> b
[[2, 3], [2, 3]]
>>> a
[[2, 3], [2, 3]]
>>> (a, b) = ([] for _ in range(2))
>>> a.append([2,3])
>>> a
[[2, 3]]
>>> b
[]
>>> b.append([2])
>>> b
[[2]]
>>> a
[[2, 3]]
为什么第一次尝试没有在内存中独立分配a
、b
?
您可以按如下方式初始化它们。
a = b = []
a = [2]
b = [2, 3]
print(a, b)
为什么第一次尝试没有在内存中独立分配a,b?因为它们在内存中引用相同的地址。
(a, b) = ([],)*2
print(id(a))
print(id(b))
# 4346159296
# 4346159296
(a, b) = ([] for _ in range(2))
print(id(a))
print(id(b))
# 4341571776
# 4341914304
Why the first attempt does not allocate a, b independently in memory?
因为您使用同一个列表来定义多个变量。它是这样的:
list1 = []
var1, var2 = list1, list1
在你的第二种情况下,你使用的是每次迭代都会创建新列表的理解。
你可以看看这个例子
list1 = [1, 2, 3]
a = [val for val in list1]
b = [val for val in list1]
c, d = ([list1]) * 2
print(f"{a=}")
print(f"{b=}")
print(f"{c=}")
print(f"{d=}")
print("Append something")
a.append("a append")
list1.append("list1 append")
print(f"{a=}")
print(f"{b=}")
print(f"{c=}")
print(f"{d=}")
输出:
a=[1, 2, 3]
b=[1, 2, 3]
c=[1, 2, 3]
d=[1, 2, 3]
Append something
a=[1, 2, 3, 'a append']
b=[1, 2, 3]
c=[1, 2, 3, 'list1 append']
d=[1, 2, 3, 'list1 append']