菜鸟学Python(3):引用和引用参数

  菜鸟学Python(3):引用和引用参数
                                                              ---- 温铭  http://blog.csdn.net/wayne92
  在Python.cn的邮件列表中看到有人问了一个问题:

>>> a=[]
>>> b={'num':0,'sqrt':0}
>>> resurse=[1,2,3]
>>> for i in resurse:
 b[
'num']=i
 b[
'sqrt']=i*i
 a.append(b)


>>> a
[{
'num': 3'sqrt': 9}, {'num': 3'sqrt': 9}, {'num': 3'sqrt': 9}]

a为什么不是想象中的 [{'num': 1'sqrt': 1}, {'num': 2'sqrt': 4}, {'num': 3'sqrt': 9}]呢?

开始也没有看明白,有人回复说是引用的原因。所以就写一些代码试一试:
>>>  a = []
>>>  b = { ' num ' :0, ' sqrt ' :0}
>>>  b[ ' num ' ] = 1
>>>  b[ ' sqrt ' ] = 1
>>>  b
{
' num ' 1 ' sqrt ' 1 }
>>>  a.append(b)
>>>  a
[{
' num ' 1 ' sqrt ' 1 }]
>>>  b[ ' num ' ] = 2
>>>  b[ ' sqrt ' ] = 4
>>>  b
{
' num ' 2 ' sqrt ' 4 }
>>>  a.append(b)
>>>  a
[{
' num ' 2 ' sqrt ' 4 }, { ' num ' 2 ' sqrt ' 4 }]

>>>  id(a)
13346496
>>>  id(a[0])
13335984
>>>  id(a[1 ])
13335984
>>> id(b)
13335984
>>> a[0]['num']=4
>>> a
[{
'num': 4'sqrt'4}, {'num': 4'sqrt'4}]
>>> b
{'num': 4, 'sqrt': 4}

可以明显的看出a中的元素其实就是b的引用!

开始抄书:)(Python编程金典P92)
    和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。

说了半天,上面那个程序应该怎么处理才能实现想要的效果类?
>>> a=[]
>>> resurse=[1,2,3]
>>> for i in resurse:
    b
={'num':0,'sqrt':0}
      print id(b)
    b[
'num']=i
    b[
'sqrt']=i*i
    a.append(b)

13334544
13335120
13335840
>>> a
[{
'num'1'sqrt'1}, {'num'2'sqrt'4}, {'num'3'sqrt'9}]
这样就可以了。相当于每次都新建一个字典对象。但有些不好,如果i的值很大,就会占很多不必要的内存。
不如这样:
>>> a = []
>>> for i in (1234567):
    a.append({
"num": i, "sqrt": i * i})

    
>>> a
[{
'num'1'sqrt'1}, {'num'2'sqrt'4}, {'num'3'sqrt'9},
{
'num'4'sqrt'16},{'num'5'sqrt'25}, {'num'6'sqrt'36},
{
'num'7'sqrt'49}]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值