python如何定义新对象

clear_shadow 2013-01-30 09:40:29
rt。我试验了下,python传递对象也是传递的是对象的引用。这样的话,如果把对象当作参数传入一个函数中,而在这个函数中如果把这个参数赋值给另一个对象,这样如果改变这两个对象中任意个的值,这两个对象都会改变。
我想问的是,如何在被调用的方法中定义一个新的对象,就是另起用一块内存地址。
测试代码如下:不知道大侠们了解了没
def testModifyPara(para01):
ret = {}
ret = para01
para01['aa'] = 'aaaa'
ret['bb'] = 'bbbb'
return ret

if __name__ == '__main__':
para = {}
print testModifyPara(para)
print para
打印结果为:
{'aa': 'aaaa', 'bb': 'bbbb'}
{'aa': 'aaaa', 'bb': 'bbbb'}
-------------------------------------------------------------------------
我的想法是在testModifyPara()中像java一样,new一个新的ret,就是给ret新分配一块内存地址,使得我改变ret的时候(ret['bb'] = 'bbbb'),para01不会被改变
...全文
279 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
clear_shadow 2013-01-30
  • 打赏
  • 举报
回复
引用 5 楼 angel_su 的回复:
ret = {} ret = para01 python的=号要看成重新绑定的意思,左边是个引用来的,那么上面连续2行逻辑上就说不过去...
左边的ret是个对象么?=号表示重新指向另一块内存地址么?
angel_su 2013-01-30
  • 打赏
  • 举报
回复
ret = {} ret = para01 python的=号要看成重新绑定的意思,左边是个引用来的,那么上面连续2行逻辑上就说不过去...
clear_shadow 2013-01-30
  • 打赏
  • 举报
回复
引用 1 楼 bugs2k 的回复:
试试copy模块的deepcopy http://docs.python.org/2/library/copy.html
还是说我在定义的时候(ret = {})就已经分配了一块内存地址,还是说在deepcopy的时候,返回了一块指向新地址的引用
bugs2k 2013-01-30
  • 打赏
  • 举报
回复
貌似基本每个对象都会重新分配内存的吧,只是其中的内容也许会通过引用共享
clear_shadow 2013-01-30
  • 打赏
  • 举报
回复
引用 1 楼 bugs2k 的回复:
试试copy模块的deepcopy http://docs.python.org/2/library/copy.html
谢谢您的及时回复。 我试验了下,确实实现了我想要的效果了。不好意思再深问一下,在python中能不能定义一个新的对象,而且这个对象是重新分配的一块内存地址呢?
bugs2k 2013-01-30
  • 打赏
  • 举报
回复
试试copy模块的deepcopy http://docs.python.org/2/library/copy.html
clear_shadow 2013-01-30
  • 打赏
  • 举报
回复
准备结贴了,从网上找到了一些资料,感觉差不多可以了。 http://luchanghong.com/python/2012/09/21/the-differences-between-copy-and-deepcopy-in-python.html 感觉如果想new个新对象的话,就用深拷贝一个对象赋值给需要的对象就行了
clear_shadow 2013-01-30
  • 打赏
  • 举报
回复
引用 8 楼 heliang6291 的回复:
一般重新赋值的话,就是新对象,如 x = 3 y = 3 此时,y与x不是同一个内存地址,除非是 x = 3 y = x 此时,y与x才是同一对象的引用。 如果不知道x的确切值,而要重新创建同样的对象,那么对于非嵌套类型,可以用浅拷贝: import copy x = [1, 2, 3] y = copy.copy(x) 如果x是嵌套类型,则需要深拷……
谢谢啦,收获很多。
ActorKeyy 2013-01-30
  • 打赏
  • 举报
回复
一般重新赋值的话,就是新对象,如 x = 3 y = 3 此时,y与x不是同一个内存地址,除非是 x = 3 y = x 此时,y与x才是同一对象的引用。 如果不知道x的确切值,而要重新创建同样的对象,那么对于非嵌套类型,可以用浅拷贝: import copy x = [1, 2, 3] y = copy.copy(x) 如果x是嵌套类型,则需要深拷贝: import copy x = [1, (1, 2), 3] y = copy.deepcopy(x)
angel_su 2013-01-30
  • 打赏
  • 举报
回复
>>> x = 1 >>> id(x) 35118384 >>> x += 1 >>> id(x) 35118372 >>> id(2) 35118372 >>> 所以说左边说看成是对象的引用或别名,这样比较好理解...

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧