python的函数调用和参数传递

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

可变对象(mutable):dict、list函数

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

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

如何定义函数?对象

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

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

# -*- 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

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

函数的定义:utf-8

a = 1

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

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

函数的调用:string

print change_a_1(a)
print a

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

因此说,最终的打印结果和返回结果以下:

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,类对象这样表明一个集合的话,能够对传入参数的内部作修改,引发外部变量值的变化。可是对同名的外部变量直接赋值,是不会改变外部变量的结果的。

相关文章
相关标签/搜索