Python 参数传递方式为赋值传递
python 函数参数既不是传值,也不是传引用,文档上定义的传递方式叫做 call by assignment (赋值传递)
如果将可变对象传递给方法,该方法会获得对同一个对象的引用,虽然可以通过此引用随意修改外部对象,但是如果在方法中重新绑定引用,外部作用域将一无所知。
以 List (mutable 类型) 为例:
def try_to_change_list_contents(the_list):
print('got', the_list)
the_list.append('four')
print('changed to', the_list)
outer_list = ['one', 'two', 'three']
print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)
传进函数的是 outer_list
的引用,可以在函数内部任意修改这个外部变量,输出:
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
但是,如果在函数内部改变变量所指的对象,外部对象不受影响,下面的例子,在函数内部,the_list
指向了新的对象,outer_list
不受影响:
def try_to_change_list_reference(the_list):
print('got', the_list)
the_list = ['and', 'we', 'can', 'not', 'lie']
print('set to', the_list)
outer_list = ['we', 'like', 'proper', 'English']
print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)
输出:
before, outer_list = ['we', 'like', 'proper', 'English']
got ['we', 'like', 'proper', 'English']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'English']
如果将不可变对象传递给方法,仍然无法重新绑定外部引用,甚至无法改变对象。
以 string (immutable 类型) 为例:
def try_to_change_string_reference(the_string):
print('got', the_string)
the_string = 'In a kingdom by the sea'
print('set to', the_string)
outer_string = 'It was many and many a year ago'
print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)
输出:
before, outer_string = It was many and many a year ago
got It was many and many a year ago
set to In a kingdom by the sea
after, outer_string = It was many and many a year ago
Python 可变数据类型与不可变数据类型
以下数据类型可变 (mutable)
Lists
Dictionaries
Sets
以下数据类型不可变 (immutable)
Integers
Floating-Point numbers
Booleans
Strings
Tuples