【问题标题】:issue with while loop in pythonpython中的while循环问题
【发布时间】:2013-07-12 16:11:32
【问题描述】:

我无法弄清楚为什么以下程序中的 while 循环 总是在 1 次迭代后停止。基本上 weightsPrevious 是如何变成的 无论输入如何,都等于一次迭代后的权重。基本上我想要 跟踪两次连续运行的权重列表以及它们是否相等 我想退出。如果我使用具有固定大量迭代的 for 循环,我会看到 连续权重列表在第一次迭代中不相等,但 while 循环总是 一个后退出。任何帮助将不胜感激。

import random

def test(inputs, targets):
    inputDim = len(inputs[0])
    outputDim = len(targets[0])
    if (len(inputs) == len(targets)):
        dataSize = len(inputs)
    else:
        return

    weights = [];

    for i in range(inputDim + 1):
        weights.append([]);
        for j in range(outputDim):
            weights[i].append(2*random.random() - 1);

    weightsPrevious = 0

    iterCount = 0
    while (weightsPrevious != weights):
        iterCount += 1
        print("iteration", iterCount)
        weightsPrevious = weights.copy()
        for k in range(dataSize):
            for j in range(outputDim):
                weights[0][j] += 0.25*(targets[k][j] - 1)*(-1)
                for i in range(inputDim):
                    weights[i + 1][j] += 0.25*(targets[k][j] - 1)*inputs[k][i]

        return weights

test([[0,0],[0,1],[1,0],[1,1]],[[0],[1],[1],[1]])

编辑:即使删除最后一个 return 语句,我也得到相同的结果

【问题讨论】:

    标签: python variable-alias


    【解决方案1】:

    发生这种情况是因为您在 while 循环的末尾有一个 returnreturn 停止函数的执行并返回weights

    我认为您需要取消缩进:

    while (weightsPrevious != weights):
        iterCount += 1
        print("iteration", iterCount)
        ...
    
    return weights # now this is going to be executed when 
                   # the while loop is finished.
    

    【讨论】:

    • 这正是我的测试文件中的内容,想知道为什么它以这种方式复制粘贴。但它似乎仍然不起作用。
    • 我只是尝试完全删除return语句,但程序在一次迭代后仍然停止
    • @BM 一个原因可能是这一行 :weightsPrevious = weights.copy(),因此,weightsPrevious 在第一次迭代后变为等于weights,并将在第二次迭代之前退出。
    • 是的,好像是这样。我在 Python 可视化器中运行代码,看起来虽然创建了不同的列表,但列表中的条目指向相同的值。我尝试使用 list(weights) 代替,但这也做同样的事情。看来我需要找到一种新的复制方式。感谢您的回复和cmets
    • @BM 我昨天详细解释了这个东西,你可能会觉得有帮助:stackoverflow.com/questions/17599175/python-list-and/…
    【解决方案2】:
    while (weightsPrevious != weights):
        iterCount += 1
        print("iteration", iterCount)
        weightsPrevious = weights.copy()
        for k in range(dataSize):
            for j in range(outputDim):
                weights[0][j] += 0.25*(targets[k][j] - 1)*(-1)
                for i in range(inputDim):
                    weights[i + 1][j] += 0.25*(targets[k][j] - 1)*inputs[k][i]
    
        return weights
    

    应该是

    while (weightsPrevious != weights):
        iterCount += 1
        print("iteration", iterCount)
        weightsPrevious = weights.copy()
        for k in range(dataSize):
            for j in range(outputDim):
                weights[0][j] += 0.25*(targets[k][j] - 1)*(-1)
                for i in range(inputDim):
                    weights[i + 1][j] += 0.25*(targets[k][j] - 1)*inputs[k][i]
    
    return weights
    

    注意返回的缩进

    【讨论】:

    • 我在 python 中以这种方式缩进,我仍然得到相同的结果。我删除了该行并将缩进与 while 语句再次对齐以确保,但我仍然得到相同的结果。
    • 我只是尝试完全删除return语句,但程序在一次迭代后仍然停止
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多