“ array [:] =某物”和“ array =某物”

时间:2018-07-26 05:39:29

标签: python python-3.x

我知道他们实际上在做同样的事情,但是如果您要说做类似的事情……

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' 完全不同吗?

2 个答案:

答案 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本身