37,719
社区成员
发帖
与我相关
我的任务
分享
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4]);
print "函数内取值: ", mylist
return
#
# # 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外取值: ", mylist
#
def sum( total ):
#返回2个参数的和."
total = 30 # total在这里是局部变量.
print "函数内是局部变量 : ", total
# return total;
return
total=0
sum(total)
#调用sum函数
print "函数外是全局变量 : ", total
>>> dir(2)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
var = 1234 这个变量 声明和赋值过程实际上是, 先创建1234这个整数对象,然后再把这个对象的引用绑定给var这个字符串。
>>> var = 1234
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'var': 1234}
再看一个例子
>>> a = 257
>>> id(a)
2845238190192
>>> def foo(arg): print(id(arg))
>>> foo(a)
2845238190192
>>> b = [1,2,3]
>>> id(b)
2845238037832
>>> foo(b)
2845238037832
>>>
从上面例子可以看到, 无论是不可变对象还是可变对象,传参的时候都是传的对象的引用。
所以严格地说:
Python的参数传递既不是传值(pass-by-value),也不是传引用(pass-by-reference),而是对象的引用(pass-by-object-reference),即传递的是一个对象的内存地址。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def changeme( mylist ):
"修改传入的列表"
print id(mylist)
mylist.append([1,2,3,4]);
print "函数内取值: ", mylist
print id(mylist)
return
#
# # 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外取值: ", mylist
#
print id(mylist)
def sum( total ):
#返回2个参数的和."
total = 30 # total在这里是局部变量.
print "函数内是局部变量 : ", total
print id(total)
# return total;
return
total=0
sum(total)
print id(total)
#调用sum函数
print "函数外是全局变量 : ", total