python的函数调用和参数传递

不可变对象(immutable):int、string、float、number、tuple

可变对象(mutable):dict、list

对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)

但是对于list来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而印象原有变量。(我们称此为指针传递)

如何定义函数?

  • def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

关于不可变对象类型的函数定义、调用和传参:

# -*- coding:utf-8 -*-

a = 1

def change_a_1(a):
    a += 1
    print a
    return a

def change_a_2(a):
    a += 1
    print a

print a
print change_a_1(a)   
print a
a = change_a_1(a)
print a
a = change_a_2(a)
print a

 最终打印出来的结果有几个?又分别是什么?主要涉及三个知识点,函数的定义、函数的调用以及传参,一旦弄清楚了,就很容易回答这个问题了。

函数的定义:

a = 1

def change_a_1(a):
    a += 1
    print a
    return a

def change_a_2(a):
    a += 1
    print a

函数的调用:

print change_a_1(a)
print a

 注意:函数的定义与函数的执行,是两个过程。定义的函数如果不调用是不会执行的!

所以说,最终的打印结果和返回结果如下:

print a          #1
print change_a_1(a) #2(函数return的返回值),2(函数内部的打印结果)
print a          #1
a = change_a_1(a)
print a          #2,2
a = change_a_2(a)
print a          #3(函数内部一次),None(最终打印结果)

 关于全局变量和局部变量:

如果函数内任意地方有赋值,那么这个被解释为局部变量;

如果函数内没有赋值,函数之前有赋值,那么将被解释为全局变量。

注意:函数内部禁止使用全局变量!(#注释后为打印值)
def change_a_3(a):
    a = 6
    a += 1
    print a
    return a

a = 2
print change_a_3(a)      #7,7
print a                         #2
a = change_a_3(a)
print a                         #7,7

 关于可变对象类型的函数定义、调用和传参:

b = [1, 2, 3, 4]


def change_b(b):
    b = b[1]
    print b
    return b

def change_b_1(b):
    b.append(13)
    print b
    return b

def change_b_2(b):
    b = [9, 7, 6, 6, 4]
    b.append(13)
    print b
    return b

print b       #[1,2,3,4]
b.pop(1)
print b       #[2,3,4]
print change_b(b)    #3,3
print b       #[2,3,4]
b = change_b(b)
print b       #3,3

b = [1, 2, 3, 4]
print change_b_1(b) #[1,2,3,4,13],[1,2,3,4,13]
print change_b_1(b) #[1,2,3,4,13,13],[1,2,3,4,13,13]
print change_b_2(b) #[9,7,6,6,4,13]
print change_b_2(b) #[9,7,6,6,4,13]

1.当函数的传入参数代表唯一的值,也就是像int这种内部无法改变的,外部的变量是无法修改的。对同名的外部变量赋值,也无法改变外部变量的值。
2.当函数传入参数是像list,dict,类对象这样代表一个集合的话,可以对传入参数的内部做修改,引起外部变量值的变化。但是对同名的外部变量直接赋值,是不会改变外部变量的结果的。

posted @ 2016-09-22 11:27  prime7  阅读(1158)  评论(0编辑  收藏  举报