菜鸟学Python(3):引用和引用参数
来源:互联网 发布:sql中的sum函数 编辑:程序博客网 时间:2024/06/06 20:33
菜鸟学Python(3):引用和引用参数
---- 温铭 http://blog.csdn.net/wayne92
---- 温铭 http://blog.csdn.net/wayne92
在Python.cn的邮件列表中看到有人问了一个问题:
a为什么不是想象中的[{'num': 1, 'sqrt': 1}, {'num': 2, 'sqrt': 4}, {'num': 3, 'sqrt': 9}]呢?
开始也没有看明白,有人回复说是引用的原因。所以就写一些代码试一试:
可以明显的看出a中的元素其实就是b的引用!
开始抄书:)(Python编程金典P92)
和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
说了半天,上面那个程序应该怎么处理才能实现想要的效果类?
这样就可以了。相当于每次都新建一个字典对象。但有些不好,如果i的值很大,就会占很多不必要的内存。
不如这样:
>>> 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}]
>>> 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}]
>>> 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}
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}]
>>> 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}]
不如这样:
>>> a = []
>>> for i in (1, 2, 3, 4, 5, 6, 7):
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}]
>>> for i in (1, 2, 3, 4, 5, 6, 7):
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}]
- 菜鸟学Python(3):引用和引用参数
- 菜鸟学Python(3):引用和引用参数
- 引用和引用参数
- 零基础学python-17.2 参数与共享引用
- python 参数:复制?引用?
- python函数参数传递引用,引用计数
- 值和引用参数
- [零基础学Python]深入变量和引用对象
- 【Python基本知识】 Python中,函数参数的引用和复制
- python函数参数引用传递
- python按引用传递参数
- python参数的引用传递
- Linux $* $@ 参数引用和数组元素引用
- 引用和使用引用传递参数《一》
- 引用和使用引用传递参数《二》
- C++引用参数和引用返回值
- 引用折叠和右值引用参数
- C++引用参数和引用返回值
- 清除恶意主页www.7939.com
- 第10回 在软件开发各个阶段的测试任务
- HttpUnit使用
- 使用struts+spring+hibernate 组装web应用
- Vi编辑器使用指南
- 菜鸟学Python(3):引用和引用参数
- 剖析Linux系统启动过程
- WinBond w90p710 uClinux移植问题
- 假设有一个rand(0,1)的0,1随机生成器,如何对于给定的(a,b),随机生成一个x, 其中 a <= x <= b
- [ASP.NET学习笔记之二十二].NET中的委托与事件研究
- 开学在即
- 水费管理系统
- 又是一個星期一
- 讲故事谈.NET委托:一个C#睡前故事