【问题标题】:Why do these lists function differently? (Python logic)为什么这些列表的功能不同? (Python 逻辑)
【发布时间】:2017-09-18 20:15:38
【问题描述】:

我偶然发现了一种创建列表的方法,它使使用变得不那么容易。让我向您展示我的代码,也许您会对我的函数与列表的不同之处有一个答案。

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

分别。

为什么?

【问题讨论】:

  • 全局变量sign未定义,所以代码根本没有运行。
  • 你去! @Prune

标签: python list logic


【解决方案1】:

createGamePlan_1 中,您每次都在循环中声明新的row 实例, 但是在createGamePlan_2 中,您声明row 一次并多次添加,因此您在第二个函数中对一个实例row 有多次引用。

【讨论】:

  • 虽然列表看起来一样,但它们不能以相同的方式操作吗?这怎么可能,第二个生成列表的列表中的列表是否以某种方式相互链接?当我尝试更改其中一个元素时,程序如何知道这一点?
  • 再次在第二个函数中你没有三个列表你在同一个列表上有三个引用,这是在循环之前声明的,希望对你有帮助
  • 很高兴为您提供帮助)
【解决方案2】:

虽然您的代码无效,但您遇到的“为什么”不受影响(我认为 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-您创建一个列表,然后多次附加同一个列表。由于列表是可变的,这会导致一个列表发生变化,这似乎会改变所有列表(因为它们都是对内存中同一个对象的引用)。

【讨论】:

    【解决方案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

    【讨论】:

    • 我明白了,尽管我在最近的课程中使用过 Python,但我从未听说过或了解过这个“参考系统”。我在哪里可以了解更多信息?
    • @SimpleProgrammer 据我所知,所有 Python 文档(例如 3.6 版)都可以在docs.python.org/3.6/index.html找到
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2016-01-19
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多