我偶然发现了一种创建一个列表的方法,这样就不太容易处理了。让我给你看一下我的代码,也许你会知道我的函数和列表有什么不同。你知道吗
sign = "-"
def createGamePlan_1(size, sign):
gPlan = []
for i in range(size):
row = [sign]*size
gPlan.append(row)
return gPlan
def createGamePlan_2(size, sign):
gPlan = []
row = [sign]*size
for i in range(size):
gPlan.append(row)
return gPlan
k = createGamePlan_1(3,sign)
k[0][0] = "X"
h = createGamePlan_2(3, sign)
h[0][0] = "X"
print(k,h)
如果我通过终端运行它的输出将是
[["X","-","-"],["-","-","-"],["-","-","-"]]
以及
[["X","-","-"],["X","-","-"],["X","-","-"]]
分别。你知道吗
为什么?你知道吗
如果要达到与第一个函数相同的效果,每次都必须创建
row
的新副本。你知道吗否则,相同的引用将附加到列表中。你知道吗
注意循环中的第一个函数
循环的每次迭代都会创建一个新对象
row
。你知道吗在
createGamePlan_1
中,每次在循环中声明新的row
实例, 但是在createGamePlan_2
中,您一次声明row
,然后多次添加它,因此您在第二个函数中对一个实例row
有多个引用。你知道吗虽然您的代码无效,但您遇到的“why”不受影响(我假定k[0][0]和h[0][0]都应该是
=0
,而不是“X”)。你知道吗这与这三行的顺序有关:
在第一种情况下,您正在执行BAC,每次迭代都会产生一个新的列表。当i=0时,创建一个列表并将其附加到主列表;当i=1时,创建一个新列表,依此类推。但是在第二种情况下,你在做ABC——你创建一个列表,然后多次附加相同的列表。由于列表是可变的,这会导致一个列表发生更改,这似乎会更改所有列表(因为它们都是对内存中同一对象的引用)。你知道吗
相关问题 更多 >
编程相关推荐