我正在修改使用这里找到ctypes的一个python包装:https://github.com/Grix/helios_dac/blob/master/sdk/examples/python/linux_example.py
我使用的可变性的逻辑和由通常的Python代码和代码不再起作用引用传递如果我改变线33和39:
for j, f in enumerate(frames[i]):
if (j < 500):
x = round(j * 0xFFF / 500)
else:
x = round(0xFFF - ((j - 500) * 0xFFF / 500))
f = HeliosPoint(int(x),int(y),255,255,255,255)
有人能解释为什么吗?是F不等同于帧[i] [j]?
据[Python 3]: The for statement:
for循环,使分配到目标列表中的变量(一个或多个)。这将覆盖所有以前分配到这些变量包括在套件中的for循环的制作:
for i in range(10): print(i) i = 5 # this will not affect the for-loop # because i will be overwritten with the next # index in the range
我将介绍一个简单的例子,然后再延伸到你的。
>>> l = [1, 2, 3] >>> for i in l: ... i += 5 ... print(i) ... 6 7 8 >>> print(l) [1, 2, 3]
相同的代码,但没有循环将是:
>>> i = l[0] >>> i += 5 >>> print(i) 6 >>> i = l[1] >>> i += 5 >>> print(i) 7 >>> i = l[2] >>> i += 5 >>> print(i) 8 >>> print(l) [1, 2, 3]
正如所看到的,分配另一个值的循环变量,不改变原有的价值。这可把更简单:
>>> some_variable = 1 >>> some_variable 1 >>> some_other_variable = some_variable >>> some_other_variable # Here it will have value 1 1 >>> some_other_variable = 2 # The value will change, but it won't affect `some_variable` >>> some_other_variable 2 >>> some_variable # Its value is unchanged 1
要在迭代,一个办法就是使用枚举(如你已经在你的代码中使用)更改列表中的值:
>>> l [1, 2, 3] >>> for idx, elem in enumerate(l): ... l[idx] = elem + 5 ... >>> print(l) [6, 7, 8]
运用同样的原则问题的方法:在你的代码段的最后一行:
f = HeliosPoint(int(x),int(y),255,255,255,255)
应该变成:
frames[i][j] = HeliosPoint(int(x), int(y), 255, 255, 255, 255)