在python中使用def函数更新值

时间:2015-03-01 19:02:28

标签: python

这是我的代码:

def posrand():
    loc = [1, 2]
    location = random.choice(loc)
    if location == 1:
        pos1 = [-.05,-.05]
        pos2 = [.05, .05]
    else:
        pos1 = [.05, .05]
        pos2 = [-.05, -.05]
# displays window and stimulus
win = visual.Window(size=(1920, 1080), fullscr=True, screen=0, monitor='testMonitor', color=[-1,-1,-1])
distractorstim = visual.ImageStim(win=win, pos=pos1, size=[0.5,0.5])
distractorstim.autoDraw = True
targetstim = visual.ImageStim(win=win, pos=pos2, size=[0.5,0.5])
targetstim.autoDraw = True

for i in range(len(ac)):
    posrand()
    targetstim.image = target[i]
    distractorstim.image = distractor[i]

    win.flip()
    core.wait(1)

我要做的是在每次试验中运行posrand函数,以便在这两个位置之间始终对位置进行洗牌。但是,它不会读取pos1和pos2值。如果将窗口和激励信息放入posrand函数中,它可以工作,但是当我尝试处理大量图像时程序会遇到错误。我怎么能这样做,以便可以在刺激上更新pos1和pos2值,但是我不必不断重绘刺激?任何帮助将不胜感激。 :)

2 个答案:

答案 0 :(得分:2)

您的问题的解释不是很完整,但乍一看:pos1pos2仅适用于posrand:它们是局部变量。你在那里做的改变不会反映在它之外。

您可能希望在模块级别定义这两个变量,然后使用python 3上的变量声明posrandglobalnonlocal内部访问它们。这样调用{ {1}}将改变外部状态(我假设你的解释会影响posrand实例的行为)。

你可以试试这个:

visual.ImageStim

然而,这是一种非常糟糕的编程方法。依赖可变的全局变量会使程序的逻辑变暗。您最有可能应该在每个循环传递中重新实例化这些pos1, pos2 = [], [] def posrand(): global pos1 global pos2 loc = [1, 2] location = random.choice(loc) if location == 1: pos1 = [-.05,-.05] pos2 = [.05, .05] else: pos1 = [.05, .05] pos2 = [-.05, -.05] 个对象。

答案 1 :(得分:1)

您的posrand正在创建局部变量。要修改全局变量,您应该执行拼接分配:

if location == 1:
    pos1[:] = [-.05,-.05]
    pos2[:] = [.05, .05]
else:
    pos1[:] = [.05, .05]
    pos2[:] = [-.05, -.05]