加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:26:20 所属栏目:Python 来源:网络整理
导读:我似乎无法在任何地方找到解释…… 假设我有一个向量y初始化为全零: from numpy import *y = zeros(5) 它也可能是一个简单的python数组,我认为它不重要. 我注意到在y:语句中for x的行为是它在y中创建每个元素的副本,因此当你修改x时,它不会修改y. for x in
我似乎无法在任何地方找到解释……

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

from numpy import *
y = zeros(5)

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

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

for x in y:
    x = 1
print y

output : array([ 0.,0.,0.])

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

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

for i in range(len(y)):
    y[i] = 2*rand()-1

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

我还能做什么?

解决方法

你可以替换这个:

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

有:

y=2*np.random.rand(5)-1

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

for y in y:

迭代y,将x设置为y中的每个元素.
如果元素是不可变对象,如str,int,float或Numpy数字类型,
然后改变x的值不会改变y中的值.

如果元素是可变对象,例如列表,那么改变列表将影响y.

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

y---> [o----o----o----o]
            ^
            |
            x

编写赋值语句时:

x += 1

现在,您将x重新分配给“指向”另一个对象:

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

x---> o

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读