这是我的代码:
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值,但是我不必不断重绘刺激?任何帮助将不胜感激。 :)
答案 0 :(得分:2)
您的问题的解释不是很完整,但乍一看:pos1
和pos2
仅适用于posrand
:它们是局部变量。你在那里做的改变不会反映在它之外。
您可能希望在模块级别定义这两个变量,然后使用python 3上的变量声明posrand
或global
在nonlocal
内部访问它们。这样调用{ {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]