为什么Python中的元素...... in ...:语句使用byValue行为?

lev*_*que 3 python iteration numpy

我似乎无法在任何地方找到解释......

假设我有一个向量y初始化为全零:

from numpy import *
y = zeros(5)
Run Code Online (Sandbox Code Playgroud)

它也可能是一个简单的python数组,我认为它不重要.

我注意到for x in y:语句的行为是它在y中复制了每个元素,因此当你修改x时,它不会修改y.

for x in y:
    x = 1
print y

output : array([ 0.,  0.,  0.,  0.,  0.])
Run Code Online (Sandbox Code Playgroud)

我的问题如下:为什么会这样?我认为Python中的所有内容都是byReference,并且很少有byValue传递?

如何使用引用变量执行以下操作?执行以下操作似乎有效:

for i in range(len(y)):
    y[i] = 2*rand()-1
Run Code Online (Sandbox Code Playgroud)

但是根据我对Python的了解,这是错误的,我相信当我开始使用数千或数百万个值的向量时它会很慢.

我还能做什么?

unu*_*tbu 8

你可以替换这个:

y = np.zeros(5)
for i in range(len(y)):
    y[i] = 2*rand()-1
Run Code Online (Sandbox Code Playgroud)

有:

y=2*np.random.rand(5)-1
Run Code Online (Sandbox Code Playgroud)

如果y是Python序列(元组,列表,数组等)或Numpy数组,

for x in y:

迭代y,设置x为每个元素y.如果元件是一样不变的对象str,int,float或一个数字numpy的类型,则改变的值x不改变的值y.

如果元素是可变对象,例如a list,那么变异list会影响y.

可以这样想:x是"指向"一个对象:

y---> [o----o----o----o]
            ^
            |
            x
Run Code Online (Sandbox Code Playgroud)

编写赋值语句时:

x += 1
Run Code Online (Sandbox Code Playgroud)

现在你重新分配x到"指向"另一个对象:

y---> [o----o----o----o]

x---> o
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你用一个列表改变一个列表x.append(1),然后 x仍然指向同一个对象(例如一个列表),但你已经改变了该列表的内容.