我使用Psychopy / iohub和Tobii TX300眼动仪记录了凝视数据。 加载hdf5文件会在BinocularEyeSampleEvent中显示以下条目: 它们与官方文档中描述的不同,因此我在哪里可以找到数据含义的准确描述? 例如,什么是PPD,测量类型'77'是什么意 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有一个测试PsychoPy Builder脚本,我用它来调查一些反直觉的行为。 结构是四个例程:
“初始化”,不是循环,“开始实验”中的以下代码:
x = 0
y = 0
z = 0
foo = [0, 0, 0]
“一个”,在循环中,“结束例程”中的以下代码:
x = x + 1
foo[0] = foo[0] + 1
thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("foo", foo)
循环中的“Two”,“End Routine”中的以下代码:
y = y + 2
foo[1] = foo[1] + 2
thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("fooY", foo[1])
thisExp.addData("foo", foo)
“三个”,循环中,“结束例程”中的以下代码:
z = z + 3
foo[2] = foo[2] + 3
thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("foo", foo)
没有其他代码,没有其他组件。 例程“One”,“Two”和“Three”形成一个循环,按顺序执行五次。 CSV输出文件的相关列如下:
trials.thisRepN trials.thisTrialN trials.thisN trials.thisIndex x y z foo fooY
0 0 0 0 1 2 3 [5, 10, 15] 2
1 0 1 0 2 4 6 [5, 10, 15] 4
2 0 2 0 3 6 9 [5, 10, 15] 6
3 0 3 0 4 8 12 [5, 10, 15] 8
4 0 4 0 5 10 15 [5, 10, 15] 10
这是预期的产出吗? 如果是这样,为什么? 请注意,各个变量x,y和z每次都在循环中显示更新的值(在循环结束时),而列表foo仅在循环迭代五次后显示最终值,但它在每一行都显示了这一点。 但是调用列表中的各个元素会显示为单个变量。
这背后的逻辑和理由是什么?
有没有办法使列表输出像其他人一样执行?
有没有办法强制输出捕获/显示任何这些变量,就像调用addData()时一样,而不是等到循环结束?
我想我知道这里出了什么问题。 这可能是因为python通过引用而不是复制来分配。 这在别处详细解释,但简要说明,
original = [1, 2]
new = original # new is simply a reference to original! It is not a copy.
new[0] = 'Oops' # original is now ['Oops', 2] as is new (which is just a reference or pointer
在您的情况下,TrialHandler接收引用,该引用仅指向在整个实验中更新的“foo”变量。 由于日志仅保存在实验结束时,“foo”中的所有行现在都指向“foo变量”,现在它保存值[5,10,15]。
这个引用分配可以非常漂亮和方便,但有时会引起头痛,就像你的例子。 它适用于所有python mutable:列表,dicts,函数和类。 但不是为了不变量,如数字,元组和字符串! 这就是为什么你的脚本适用于数字但不适用于列表的原因。
有不同的解决方案。 最简单的可能是更换addData
与调用thisExp.addData("foo", tuple(foo))
其中可变列表转换为不可变的元组。 也可以执行thisExp.addData("foo", [x for x in foo])
。 针对各种对象的更全面的解决方案是在实验开始时运行import copy
,然后在其他代码块中添加类似thisExp.addData("foo", copy.copy(foo))
的数据(如果有的话)一个复杂的对象,请使用copy.deepcopy
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.