我需要在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)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
为什么会这样?我真的不明白:
>>> P = [ [()]*3 ]*3
>>> P
[[(), (), ()], [(), (), ()], [(), (), ()]]
>>> P[0][0]=1
>>> P
[[1, (), ()], [1, (), ()], [1, (), ()]]
Run Code Online (Sandbox Code Playgroud) 我在Python中使用嵌套列表时遇到了一些问题.
基本上,我有一个包含所有0值的2D列表,我想在循环中更新列表值.
但是,Python不会产生我想要的结果.有什么我误解range()和Python列表索引?
some_list = 4 * [(4 * [0])]
for i in range(3):
for j in range(3):
some_list[i+1][j+1] = 1
for i in range(4):
print(some_list[i])
Run Code Online (Sandbox Code Playgroud)
我期望的结果是:
[0, 0, 0, 0]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
但是Python的实际结果是:
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
[0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
在Python中,如果我将对象列表乘以整数,我会得到一个对该对象的引用列表,例如:
>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)
如果我想要的行为是创建原始对象的副本列表(例如,通过"copy.copy()"方法或某种标准创建的副本,是否有一种优雅的方法可以使用相同的乘法运算符执行此操作?或者我应该坚持列表理解还是什么?例如
[[] for x in range(0,3)]
Run Code Online (Sandbox Code Playgroud)
任何版本的Python都可以.
我有一个表格列表:
list = [[3, 1], [3, 2], [3, 3]]
Run Code Online (Sandbox Code Playgroud)
我想将它分成两个列表,一个列表中每个子列表的x值,另一个列表中每个子列表的y值.
我目前有这个:
x = y = []
for sublist in list:
x.append(sublist[0])
y.append(sublist[1])
Run Code Online (Sandbox Code Playgroud)
但是这会返回这个,我不知道为什么:
x = [3, 1, 3, 2, 3, 3]
y = [3, 1, 3, 2, 3, 3]
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()在这种情况下更好?
设置变量.另一个变量设置为第一个.第一个改变了价值.第二个没有.从一开始就是编程的本质.
>>> a = 1
>>> b = a
>>> b = b - 1
>>> b
0
>>> a
1
Run Code Online (Sandbox Code Playgroud)
然后我将它扩展到Python列表.声明并附加列表.宣布另一个列表与第一个列表相同.第二个列表中的值发生变化.神秘的是,第一个列表中的值虽然没有直接作用,但也会发生变化.
>>> alist = list()
>>> blist = list()
>>> alist.append(1)
>>> alist.append(2)
>>> alist
[1, 2]
>>> blist
[]
>>> blist = alist
>>> alist.remove(1)
>>> alist
[2]
>>> blist
[2]
>>>
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我如何防止这种情况发生 - 我希望alist对blist(不可变的,如果你愿意的话)的变化不感兴趣?
我已经使用Python多年了,但只是注意到一个非常令人困惑的事情.
a=[[]]*3
a[0].append(3)
Run Code Online (Sandbox Code Playgroud)
和
a=[[] for i in range(3)]
a[0].append(3)
Run Code Online (Sandbox Code Playgroud)
即使类型(列表)相同,也不会产生相同的效果.第一个产量a=[[3], [3], [3]],第二个产量a=[[3],[],[]](如预期的那样).
有人有解释吗?