python中for循环的作用域问题
在下面的代码中,在对第一个循环中的行进行了一系列操作之后,当我打印该行时,我会看到我想要的结果。然而,在退出第一个循环后,我发现在变量数据集中得到了不同的结果。我知道这是一个范围问题,但我无法弄清楚问题是什么,以及如何获得第一个“print”语句显示的所需结果。谢谢你的帮助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
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]
[[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个副本都是如此),并且您看到好像什么都没有发生。那只是,嗯。。。不走运。