我需要在Python中创建一个列表列表,所以我输入以下内容:
myList = [[1] * 4] * 3
Run Code Online (Sandbox Code Playgroud)
列表看起来像这样:
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
然后我改变了最里面的一个值:
myList[0][0] = 5
Run Code Online (Sandbox Code Playgroud)
现在我的列表看起来像这样:
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
我确信这已在某个地方得到解答,但我不确定如何描述它.
假设我想创建一个包含3个空列表的列表,如下所示:
lst = [[], [], []]
Run Code Online (Sandbox Code Playgroud)
这样做我以为我很聪明:
lst = [[]] * 3
Run Code Online (Sandbox Code Playgroud)
但是我发现,在调试了一些奇怪的行为之后,这导致了对一个子列表的追加更新,比如lst[0].append(3),更新整个列表,[[3], [3], [3]]而不是[[3], [], []].
但是,如果我用列表初始化列表
lst = [[] for i in range(3)]
Run Code Online (Sandbox Code Playgroud)
然后做lst[1].append(5)了预期的[[], [5], []]
我的问题是为什么会发生这种情况?有趣的是,如果我这样做
lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
Run Code Online (Sandbox Code Playgroud)
那么单元格0的"连接"就被打破了[[5,3],[],[]],但是我得到了,但lst[1].append(0)仍然会导致[[5,3],[0],[0].
我最好的猜测是在表单中使用乘法[[]]*x会导致Python存储对单个单元格的引用......?
最近我做了2个实验:
(1):
>>> a = dict(zip([1,2,3],[4]*3))
>>> a
{1: 4, 2: 4, 3: 4}
>>> a[1] = 111
>>> a
{1: 111, 2: 4, 3: 4}
Run Code Online (Sandbox Code Playgroud)
(2):
>>> a = dict(zip([1,2,3],[{'a':True,'b':True}]*3))
>>> a
{1: {'a': True, 'b': True},
2: {'a': True, 'b': True},
3: {'a': True, 'b': True}}
>>> a[1]['a']=False # Here I changed the value of a[1]['a'] from True to False
>>> a
{1: {'a': False, 'b': True},
2: {'a': False, 'b': True},
3: {'a': False, 'b': True}} #all …Run Code Online (Sandbox Code Playgroud) 我正在建立一份清单清单.我正在读取输入文件中的元素.我正在读取文件中的每一行作为字符串单元素到列表中的子列表.首先,我创建了列表列表:
>>> b = [[]] * 5
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试追加项目时,我得到以下内容:
>>> b[1].append("abc")
>>> b
[ ['abc'], ['abc'], ['abc'], ['abc'], ['abc'])
Run Code Online (Sandbox Code Playgroud)
为什么要append更改所有子列表?就是insert()在这种情况下更好?
我在python中看到一个非常不寻常的行为..请让我知道我做错了什么!
bc = [[0]*(n+1)]*(n+1)
for i in range(n+1):
bc[i][i] = 1
print (bc)
Run Code Online (Sandbox Code Playgroud)
产量
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
我试图将二维数组的对角元素初始化为1,但它正在用1初始化所有元素.我认为我在访问二维数组时遇到了问题.
另外,请告诉我如何使用两个循环来访问二维数组的所有元素..我的下一步...
谢谢.
我正在读一本关于Python的书,关于多目标任务的书中有一个特殊的部分.现在这本书解释如下:

但我没有看到这个的使用.这对我来说毫无意义.为什么要使用更多变量?有理由这样做吗?是什么让这与使用如此不同:a='spam'然后打印a3次?
我只能想到用它来清空一行中的变量.
为什么要[0] * 5创建一个列表[0, 0, 0, 0, 0],而不是[[0], [0], [0], [0], [0]]?
*操作员是否重复[0]5次导致[[0], [0], [0], [0], [0]]?