今天做了个实验,代码是这样的:
===
data.py ===
class Data:
def __init__(self):
self.base_x = 123
===
plugin.py ===
class Plugin:
def __init__(self, para, data):
self.para = para
self.data = data
self.data.para = para
def remove(self):
del self.data.para
===
main.py ===
from data import Data
from plugin import Plugin
dd = Data()
pp = Plugin(999, dd)
print dd.base_x
print dd.para
pp.remove()
print dd.para
== 输出结果是这样的:==
123
999
Traceback (most recent call last):
File "C:\test\
main.py", line 11, in <module>
print dd.para
AttributeError: Data instance has no attribute 'para'
[Finished in 0.1s with exit code 1]
那么 Plugin 的对象 pp 的初始化函数参数 data,实际上是 Data 类 dd 的实际指针。所以我执行 del self.data.para 后 dd 也就没有这个属性了。
这样的话 pp.data 实际和 main 中的 dd 指向的都是同一个对象。
请问各位 v2exer 们,有关 python 传递参数这种对象循环传递,以及函数参数是引用还是拷贝的知识在哪里能有介绍?
欢迎讨论
yuelang85
2013-05-09 17:23:59 +08:00
可以使用id函数来测试。
python中,没有传递值,任何时候都是传递指针。
>>> def a(x, y):
..._____print id(x), id(y)
..._____x.append(1)
..._____y+=1
..._____print id(x), id(y)
...
>>> x = []
>>> y = 0
>>> id(x), id(y)
(4547969608, 140234989831872)
>>> a(x, y)
4547969608 140234989831872
4547969608 140234989831848
>>>
int,str是不可变对象,自身不能改变,所以修改的时候会产生新对象。而list,dict等可以修改自身
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/68063
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.