Python变量作用域及其具体示例

Python变量作用域及其具体示例,python,scope,Python,Scope,这个问题以前有人问过,但不太适合我的情况 right = 0 mistake = 0 plt.figure(figsize=(16,16)) for i in range(test_image_batch.shape[0]): plt.subplot(12,12, i+1) plt.imshow(test_image_batch[i]) plt.axis('off') bestnum = 0.0 bestclass = 0 for j i

这个问题以前有人问过,但不太适合我的情况

right = 0 
mistake = 0
plt.figure(figsize=(16,16))
for i in range(test_image_batch.shape[0]): 
    plt.subplot(12,12, i+1)
    plt.imshow(test_image_batch[i])
    plt.axis('off')
    bestnum   = 0.0
    bestclass = 0

    for j in range(10):
        if bestnum < batch_prediction_array[i][j]:
            bestnum = batch_prediction_array[i][j]
            bestclass = j
    print("bestclass", bestclass) #only gives the correct maxmimum value when bestclass is declared inside the outer for loop
    if test_label[i] == bestclass:
        plt.title(cifar10_labels[bestclass])
        right += 1
    else:
        plt.title(cifar10_labels[bestclass] + "!=" + cifar10_labels[test_label[i][0]], color='#ff0000')
        mistake += 1 
right=0
错误=0
plt.图(figsize=(16,16))
对于范围内的i(测试图像批处理形状[0]):
plt.子地块(12,12,i+1)
plt.imshow(测试图像批处理[i])
打印轴(“关闭”)
bestnum=0.0
最佳等级=0
对于范围(10)内的j:
如果bestnum<批处理预测数组[i][j]:
bestnum=批处理数组[i][j]
最佳等级=j
打印(“bestclass”,bestclass)#仅当在外部for循环中声明bestclass时,才给出正确的最大值
如果测试标签[i]==bestclass:
产品名称(cifar10\U标签[bestclass])
右+=1
其他:
plt.title(cifar10_标签[bestclass]+“!=”+cifar10_标签[test_标签[i][0]],颜色=“#ff0000”)
错误+=1
这是我的代码的一部分,搜索最大预测值并将其绘制在图形上

在我的理解中,bestclass应该具有更内部范围的值,因此当bestclass第一次在范围内的i(test_image_batch.shape[0])的
内部和外部声明时,bestclass应该具有相同的值:
。当在外部for循环中声明时,bestclass仅为所有批处理数组[i]提供正确的最大值。当在外部for循环之外声明bestclass时,它只打印第一批\u预测\u数组[i]的正确最大值

我百分之百确信,除了上面显示的代码之外,代码中的任何地方都没有声明bestclass

更奇怪的是,我无法重现同样的行为

所以我的问题是我错过了什么?我理解LEGB规则,但在这个特殊情况下。这似乎不符合立法局的规定

如果这有帮助的话,我来自java背景


编辑:我刚刚发现,当在外部for循环外部声明bestclass时,if语句被跳过,但bestclass值被更改为1。(这是批处理预测数组[0][3])

这里只有一个作用域,因为您没有模块、函数或类。Python没有块作用域。你能解释为什么会出现这种奇怪的行为吗?我在编辑部分添加了更多信息。如果没有范围,怎么知道将使用bestclass的哪个值呢?我不能,因为这里没有足够的信息来运行代码。