我知道他们实际上在做同样的事情,但是如果您要说做类似的事情……
curpop = this_other_ndarray
i = 0;
while i<20:
curpop[:] = select(curpop, parameter, parameter1)
stuff
more stuff
curpop[:] = some_stuff_I_did
i += 1;
所以上面的代码只是在说,在我进入世代循环之前,我将从“另一个ndarray”中获取第一代种群。 然后,我计划一遍又一遍地更改该数组,每次重新启动循环时,我只会从自身中选择一些,但我将其声明为与现在相等。在Python3中可以吗?
是声明
'array[:] = some of it self'
与
'array = some of itself'
完全不同吗?
答案 0 :(得分:1)
这是完全不同的两件事。
第一个是简单分配。
foo = bar
此赋值语句仅表示,左侧的名称现在与右侧的名称指向同一对象。这些语句不会修改任何一个对象。
既不会创建对象,也不会 销毁对象。但是,如果丢失了对象的姓氏,则将丢失该对象。 CPython运行时使用引用计数作为内存管理策略,并将自动回收引用计数为零的对象。
在Python中,变量的作用就像对象名称一样,您可以创建,销毁和更改它们引用的对象。可以将它们视为名称标签。
现在,这样的语句:
foo[:] = bar
实际上是 方法调用。可以翻译为:
foo.__setitem__(slice(None, None, None), bar)
观察:
>>> class Foo:
... def __setitem__(self, key, value):
... print("Key:", key, "Value:", value)
...
>>> class Bar: pass
...
>>> foo = Foo()
>>> bar = Bar()
>>> foo[:] = bar
Key: slice(None, None, None) Value: <__main__.Bar object at 0x104aa5c50>
因此,实际上,对象的 type 控制此语句的最终效果。在numpy.ndarray
对象的情况下,基于切片的分配与基于list
的切片分配的工作方式相似,因为它会原位更改数组对象,还有一些警告,例如广播。请参阅相关文档:
https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html#assigning-values-to-indexed-arrays
答案 1 :(得分:-1)
在许多情况下
curpop[:]= iterable_value_as_tuple_string_dictionary_and_list_etc
做与
相同的操作curpop=iterable_value_as_tuple_string_dictionary_and_list_etc
当然首先要分配一个字符串,否则在任何步骤中都将失去在后续步骤中使用[:]
再次分配东西的能力
请注意
curpop[:]= notiterable_value != curpop=notiterable_value
第一个将notiterable_value
分配给curpop
的每个元素,第二个将值notiterable_value
分配给curpop
本身