为什么这些列表的功能不同?(Python逻辑)

2024-10-03 21:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我偶然发现了一种创建一个列表的方法,这样就不太容易处理了。让我给你看一下我的代码,也许你会知道我的函数和列表有什么不同。你知道吗

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","-","-"]]

分别。你知道吗

为什么?你知道吗


Tags: 方法函数代码in列表forsizereturn
3条回答

如果要达到与第一个函数相同的效果,每次都必须创建row的新副本。你知道吗

def createGamePlan_2(size, sign):
    gPlan = []
    row = [sign]*size
    for i in range(size):
        gPlan.append( list( row ) ) # <==
    return gPlan

否则,相同的引用将附加到列表中。你知道吗

注意循环中的第一个函数

for i in range(size):
    row = [sign]*size

循环的每次迭代都会创建一个新对象row。你知道吗

createGamePlan_1中,每次在循环中声明新的row实例, 但是在createGamePlan_2中,您一次声明row,然后多次添加它,因此您在第二个函数中对一个实例row有多个引用。你知道吗

虽然您的代码无效,但您遇到的“why”不受影响(我假定k[0][0]和h[0][0]都应该是=0,而不是“X”)。你知道吗

这与这三行的顺序有关:

row = [sign]*size      // A
for i in range(size):  // B
gPlan.append(row)      // C

在第一种情况下,您正在执行BAC,每次迭代都会产生一个新的列表。当i=0时,创建一个列表并将其附加到主列表;当i=1时,创建一个新列表,依此类推。但是在第二种情况下,你在做ABC——你创建一个列表,然后多次附加相同的列表。由于列表是可变的,这会导致一个列表发生更改,这似乎会更改所有列表(因为它们都是对内存中同一对象的引用)。你知道吗

相关问题 更多 >