目录
1.问题描述
Python中为方便对列表进行修改,规定列表传入函数后进行的修改是直接针对原列表所在地址的,即在函数中对传入的列表的修改是全局的、永久的。
示例代码如下:
def fun(list):
list[0][0]=18
list_1 = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
print(list_1)
print(id(list_1))
fun(list_1)
print(list_1)
print(id(list_1))
运行结果:
列表list_1进入函数fun进行修改后,其值在全局上也发生变化。
2.与Python其他序列类型比较
列表list有第一节的特性,思考:Python的其他序列是否有相同特性。
Python主要有5种序列,如下表:
Python的5种序列的对比 | ||||
数据类型 | 序列类型 | 元素是否可重复 | 是否有序 | 定义符号 |
列表list | 可变序列 | 可重复 | 有序 | [ ] |
元组tuple | 不可变序列 | 可重复 | 有序 | ( ) |
字典dict | 可变序列 | Key不可重复,Value可重复 | 无序 | {key:value} |
集合set | 可变序列 | 不可重复 | 无序 | { } |
字符串str | 不可变序列 | 可重复 | 有序 | ‘ ’ |
2.1.元组
元组是不可变序列,元素不能改变,故元祖没有第一节的特性。
2.2.字典
代码测试如下:
def fun_1(d):
d['名字'] = '居家学习研究牲'
dict_1={'名字':'居家学习带学牲','年龄':23}
print(dict_1)
print(id(dict_1))
fun_1(dict_1)
print(dict_1)
print(id(dict_1))
运行结果:
故字典有第一节所述特性。
2.3.集合
集合无序,无法索引只能遍历,不可以对集合进行直接修改。故集合没有第一节的特性。
2.4.字符串
元组是不可变序列,元素不能改变,故字符串没有第一节的特性。
3.与C语言比较
C语言中有局部变量与全局变量的区分。
在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,在函数内进行的修改也仅限与外部无关。这称为“局部变量”。特别的,传入局部函数形式参数也是局部变量。
在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是“全局变量”。
Python对于此部分的规定与C语言略有不同,由C语言入门编程的同学在学习需要注意。
4.结论
1.Python的列表、字典在传入局部函数后的修改是全局的。
2.元组、集合、字符串不需要考虑局部函数的改动造成全局上数据的变动。
3.避免方法:可以应用“深拷贝”的方法,得到新的序列进行改动,从而避免局部函数对原数据序列造成影响。
水平有限,若有错误,敬请指教。
vx:HZ2513609007
标签:函数,Python,list,列表,print,dict,序列 From: https://blog.csdn.net/qq_25896787/article/details/142422606