咸糖记录编程的地方

念念不忘,必有回响。

目录
python 参数传递
/  

python 参数传递

首先要明确 所有变量都是内存的一个引用

def fun(a):
    print(a)
    a=2

a=1
fun(a)
print(a)

#out
#1
#1

对于这种情况我的解释是在a传入fun的时候 函数产生了一个新的引用指向1的内存地址
然后函数内部切换了a的传入地址导致但是函数外部没有任何改变

但是

a=[]
def fun(a):
    a.append(1)
print(a)
fun(a)
print(a)

#out
#[]
#[1]

却发现使用列表却没有输出空 这是因为python的对象分为可变对象和不可变对象
数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型
就是不可变对象传递的是内容 但是可变对象传递的是引用
在传入函数的时候拷贝了引用 两个引用指向同一个内存地址
当一个修改了内存地址的时候另一个也会改变

这样可以更加直观的观察道

a=1
def fun (a):
    print("fun in ",id(a))
    print(id((2)))
    a=2
    print("re-point",id(a),id(2))
    #引用a指向了2的内存
print("func_out",id(a),id(1))
fun(a)
print(id(a))
print(a)

#func_out 10919424 10919424
#fun in  10919424
#10919456
#re-point 10919456 10919456
#10919424
#1

可以发现外部改变a指向的地址一直没有改变 只是函数内部a的指向发生了改变

a=[]
def fun(a):
    print("fun in ",id(a))
    a.append(1)
    print("fun in ",id(a))

print("func out",id(a))
fun(a)
print(a)

func out 139769154940616
fun in  139769154940616
fun in  139769154940616
[1]
#同理
def try_to_change_list_content(the_list):
    print('got',the_list)
    the_list.append('four')
    print('change to ',the_list)

outer_list=['one','two','three']
print('before',outer_list)
try_to_change_list_content(outer_list)
print(outer_list)

#before ['one', 'two', 'three']
#got ['one', 'two', 'three']
#change to  ['one', 'two', 'three', 'four']
#['one', 'two', 'three', 'four']

因为列表是可变对象 所以可用改变他的值 因为两个引用指向的是相同的
地址 所以在函数外部的也会发生变化

def try_to_change_list_reference(the_list):
    print(id(the_list))
    print('got',the_list)
    the_list=the_list+['and']
    print(id(the_list))
    print("set to " ,the_list)
outer_list = ['we', 'like', 'proper', 'English']
print(outer_list)
try_to_change_list_reference(outer_list)
print(outer_list)
#同理
a=1
def add(b):
    print(id(b))
    b=b+1
    print(id(b))

add(a)
print(a)

但是一旦有赋值操作的时候 内存就会发生改变

我们需要返回值

def try_to_change_string_reference(the_string):
    print('got',the_string)
    the_string='In a kingdom by the sea'
    return the_string

outer_string='it was the many a year ago'

print('before,outer_string=',outer_string)

try_to_change_string_reference(outer_string)
print('after',outer_string)

标题:python 参数传递
作者:xiantang
地址:http://xiantang.info/articles/2019/06/03/1559551072377.html

评论