Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中for循环的作用域问题_Python_For Loop_Scope - Fatal编程技术网

python中for循环的作用域问题

python中for循环的作用域问题,python,for-loop,scope,Python,For Loop,Scope,在下面的代码中,在对第一个循环中的行进行了一系列操作之后,当我打印该行时,我会看到我想要的结果。然而,在退出第一个循环后,我发现在变量数据集中得到了不同的结果。我知道这是一个范围问题,但我无法弄清楚问题是什么,以及如何获得第一个“print”语句显示的所需结果。谢谢你的帮助 import random random.seed(1234567) Key=[[.5,.5]] Dataset=[[0]+[0]*1]*int(10/2) +[[1]+[0]*1]*int(10/2) print "re

在下面的代码中,在对第一个循环中的行进行了一系列操作之后,当我打印该行时,我会看到我想要的结果。然而,在退出第一个循环后,我发现在变量数据集中得到了不同的结果。我知道这是一个范围问题,但我无法弄清楚问题是什么,以及如何获得第一个“print”语句显示的所需结果。谢谢你的帮助

import random
random.seed(1234567)
Key=[[.5,.5]]
Dataset=[[0]+[0]*1]*int(10/2) +[[1]+[0]*1]*int(10/2)

print "results I need"
for row in Dataset:
    response=row[0]
    for i in xrange(len(Key)):
        if random.random() < Key[i][response]: 
            row[i+1]=response
        else: 
            row[i+1]=1-response
    print row

print "Results I get"
for row in Dataset:
    print row
随机导入
随机。种子(1234567)
键=[.5,.5]]
数据集=[[0]+[0]*1]*int(10/2)+[[1]+[0]*1]*int(10/2)
打印“我需要的结果”
对于数据集中的行:
响应=行[0]
对于x范围内的i(len(Key)):
if random.random()
这根本不是范围界定问题。您错误地构造了
数据集
,导致它由对同一列表的两组5个引用组成

Dataset = [[0]+[0]*1 for x in range(10//2)] + [[1]+[0]*1 for x in range(10//2)]

这根本不是一个范围问题。您错误地构造了
数据集
,导致它由对同一列表的两组5个引用组成

Dataset = [[0]+[0]*1 for x in range(10//2)] + [[1]+[0]*1 for x in range(10//2)]

问题在于如何构造数据集。It内容并非都是唯一的列表——其中有几个是相同的对象(不仅仅是相同的内容)。这很容易解决:

Dataset=[[0,1] for i in range(10//2)] + [[1,0] for i in range(10//2)]

问题在于如何构造数据集。It内容并非都是唯一的列表——其中有几个是相同的对象(不仅仅是相同的内容)。这很容易解决:

Dataset=[[0,1] for i in range(10//2)] + [[1,0] for i in range(10//2)]
  • Python具有引用语义。原始的
    数据集
    包含对公共
    [0,0]
    [1,0]
    子列表的多个引用。(我也不明白为什么要使初始化如此复杂。)
您可以通过对xrange(5)中的i使用
[[0,0]+[[1,0]来修复此问题

  • 你剩下的逻辑也是不必要的复杂。我们可以使用条件表达式将两个赋值合并在一起,我们应该使用直接迭代,而不是在人工索引列表上迭代(
    xrange
这看起来像:

for row in Dataset:
    response = row[0]
    for k in Key:
        row[i + 1] = response if random.random() < k[response] else 1 - response
  • Python具有引用语义。原始的
    数据集
    包含对公共
    [0,0]
    [1,0]
    子列表的多个引用。(我也不明白为什么要使初始化如此复杂。)
您可以通过对xrange(5)中的i使用
[[0,0]+[[1,0]来修复此问题

  • 你剩下的逻辑也是不必要的复杂。我们可以使用条件表达式将两个赋值合并在一起,我们应该使用直接迭代,而不是在人工索引列表上迭代(
    xrange
这看起来像:

for row in Dataset:
    response = row[0]
    for k in Key:
        row[i + 1] = response if random.random() < k[response] else 1 - response

这不是范围界定的问题我想他想更新数据集

请参见下面修改的脚本

import random
random.seed(1234567)
Key=[[.5,.5]]
Dataset=[[0]+[0]*1]*int(10/2) +[[1]+[0]*1]*int(10/2)

print "results I need"
for row in range(len(Dataset)): # Changes
    response=Dataset[row][0]
    for i in xrange(len(Key)):
        if random.random() < Key[i][response]:
            Dataset[row][i+1]=response # Important
        else:
            Dataset[row][i+1]=1-response # Important
    print Dataset[row]

print "Results I get"
for row in Dataset:
    print row
随机导入
随机。种子(1234567)
键=[.5,.5]]
数据集=[[0]+[0]*1]*int(10/2)+[[1]+[0]*1]*int(10/2)
打印“我需要的结果”
对于范围内的行(len(Dataset)):#更改
响应=数据集[行][0]
对于x范围内的i(len(Key)):
if random.random()
这不是范围界定的问题,我想他想更新数据集

请参见下面修改的脚本

import random
random.seed(1234567)
Key=[[.5,.5]]
Dataset=[[0]+[0]*1]*int(10/2) +[[1]+[0]*1]*int(10/2)

print "results I need"
for row in range(len(Dataset)): # Changes
    response=Dataset[row][0]
    for i in xrange(len(Key)):
        if random.random() < Key[i][response]:
            Dataset[row][i+1]=response # Important
        else:
            Dataset[row][i+1]=1-response # Important
    print Dataset[row]

print "Results I get"
for row in Dataset:
    print row
随机导入
随机。种子(1234567)
键=[.5,.5]]
数据集=[[0]+[0]*1]*int(10/2)+[[1]+[0]*1]*int(10/2)
打印“我需要的结果”
对于范围内的行(len(Dataset)):#更改
响应=数据集[行][0]
对于x范围内的i(len(Key)):
if random.random()
请包括实际和预期输出的示例。请注意,
[[0]]*10
实际上并不创建内部列表的副本(
[0]
)。这意味着该列表的所有十项都将引用同一个列表实例。其中一个的改变将反映在所有其他的方面。非常感谢你,这非常有意义。只是一个旁注:如果你使用了一个更“随机”的种子,你可能会意识到其他事情正在发生。但是对于这个种子(1234567),第5个和第10个随机数都大于0.5,所以它们实际上复制了初始列表(当然,它们的所有5个副本都是如此),并且您看到好像什么都没有发生。那只是,嗯。。。不吉利。请提供实际和预期输出的示例。请注意,
[[0]]*10
实际上并不创建内部列表的副本(
[0]
)。这意味着该列表的所有十项都将引用同一个列表实例。其中一个的改变将反映在所有其他的方面。非常感谢你,这非常有意义。只是一个旁注:如果你使用了一个更“随机”的种子,你可能会意识到其他事情正在发生。但是对于这个种子(1234567),第5个和第10个随机数都大于0.5,所以它们实际上复制了初始列表(当然,它们的所有5个副本都是如此),并且您看到好像什么都没有发生。那只是,嗯。。。不走运。