返回信息流定义一个方法
def do_some_thing(arg):
...
return return_data
然后调用方法
arg = [1, 2, 3]
data = do_some_thing(arg)
请问,将arg实参传递给函数do_some_thing的时候,有列表拷贝吗?然后data接收方法的返回值的时候,有数据拷贝吗?
C++有值调用和引用调用,Python中的调用方法是什么呢?求大神解答
这是一条镜像帖。来源:北邮人论坛 / python / #3205同步于 2014/8/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
Python中方法调用以及返回值时的拷贝问题
Smutty
2014/8/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
赋值语句,比如说
a = 5
a = 'hello'
为什么a既能是整数类型也能是字符串类型呢
因为a是没有类型的 在某种程度上来说也是不占内存空间的
有类型、并且分配内存的是5 和'hello'
【 在 Smutty (Future_Smutty) 的大作中提到: 】
: 定义一个方法
: [code=py]
: def do_some_thing(arg):
: ...................
总结了一下,Python中的参数传递是这样的,不管可变
对象(list,dict等)还是不可变对象(integer,string等),
都是引用传递但是在函数中,如果要改变不可变对象,则会
创建一个新的对象;对于可变对象,则更改的是传递进来的实参本身。
函数的返回值都是引用传递的
不对之处,还请指出
【 在 wangxiaobupt 的大作中提到: 】
: 赋值语句,比如说
: a = 5
: a = 'hello'
: ...................
我觉得跟对象可不可以改变没关 跟具体操作有关
有的操作是在原对象上进行的,而有的操作会将结果返回出来
>>> def listadd(arg):
arg = arg + [1]
return arg
>>> lis = [1,2,3]
>>> lis2 = listadd(lis)
>>> lis
[1, 2, 3]
>>> lis2
[1, 2, 3, 1]
>>>
>>> def listadd(arg):
arg.append(1)
return arg
>>> lis = [1,2,3]
>>> lis2 = listadd(lis)
>>> lis
[1, 2, 3, 1]
>>> lis2
[1, 2, 3, 1]
>>>
【 在 Smutty 的大作中提到: 】
: 总结了一下,Python中的参数传递是这样的,不管可变
: 对象(list,dict等)还是不可变对象(integer,string等),
: 都是引用传递但是在函数中,如果要改变不可变对象,则会
: ...................
【 在 wangxiaobupt 的大作中提到: 】
: 我觉得跟对象可不可以改变没关 跟具体操作有关
: 有的操作是在原对象上进行的,而有的操作会将结果返回出来
:
: ...................
这个其实还是和可变不可变有关
list + 就是新申请了一个对象
append是在原有基础上添加的 没有新对象
【 在 Smutty 的大作中提到: 】
: 总结了一下,Python中的参数传递是这样的,不管可变
: 对象(list,dict等)还是不可变对象(integer,string等),
: 都是引用传递但是在函数中,如果要改变不可变对象,则会
: ...................
应该差不多吧 具体的描述也不是太懂 但是实际上如果没有修改或者是对可变对象的修改就是没有生成新对象的
def test(arg):
print(id(arg))
return_data = 1
print(id(return_data))
return return_data
arg = [1,2,3]
print(id(arg))
data = test(arg)
print(id(data))
主要是=这个操作的问题
比如arg1 = arg 这两个ID就是一样的
arg1 = arg[:] 这两个ID就不一样了,但是arg1[0]和arg[0]的ID还是一样的
a=1+2 a为3 这个3是个新的整型对象, ‘+’这个操作应该符合这个标准,我是这么认为的
【 在 wangxiaobupt 的大作中提到: 】
: 我觉得跟对象可不可以改变没关 跟具体操作有关
: 有的操作是在原对象上进行的,而有的操作会将结果返回出来
:
: ...................
习惯了 ref 以后写 c 又觉得奇奇怪怪。就是和 mutable 与否有关,具体而言,= 号全是复制引用。你的理解差不多了,但是immutable 就是 immutable,什么叫做改变 immutable 的对象?
a = 1 # a -> object #1 (int 1) (maybe a immediate integer)
b = a # b -> object #1
a = [1] # a -> object #2 (list(1))
b = a # b -> object #2
看,这里是统一的。
也可以用浅拷贝来理解?(没必要但是
传参和以上的 = 号一样。
以下内容来自Python核心编程
——
赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应
该如此。在Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还
是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。