python学习入门番外1 变量与对象,函数传值问题 2018.8.18
程序员文章站
2024-03-20 10:50:10
...
在函数传值的问题中,多有对函数传值是按值传递还是按引用传递参数的讨论,这些都源于C系语言。
但事实上,python中并不适用。
默认情况下,在C语言中,参数是按照值来传递的,这需要生成函数的传入参数的一个副本以供使用,这时你不能修改传入参数的初始内容
当使用指针变量(*var)时,将通过间接引用运算符将变量(参数)的内存地址传递给函数,这时可以改变传入参数的值。
而在python中,传入参数也有可变与不可变之分,人们认为这是传值或引用的区别,但事实上并非如此
明确:python中始终按值传递参数,(见于python程序设计第三版P126)
那为什么会有能否对传入参数修改的区别呢?
我们需要弄清三点:
1.变量与对象的区别
2.python中的传值意义
3.可变对象与不可变对象
1.python中,一切皆对象,变量无数据类型,对象才有数据类型!
变量始终引用对象(指向内存地址)
并且python变量赋值是特殊的,它不是变量盒子模型,而是类似于标识符充当贴纸贴到内存地址上(即变量修改时,不是新值被写入变量的内存地址,而是变量指向新值的内存地址)
变量盒子模型中,变量是被声明有内存地址的
而python变量未被声明,不存在内存。 对象才有内存地址,变量只是引用作用
2.python中的传值应是赋值的意思。
下面来看函数调用的四步过程:
1.调用程序暂停
2.实参的值赋给形参
3.执行函数体
4.控制返回,函数返回值作为表达式结果
所以传值是指 实参赋值给形参 ,以此来传递参数
3.可变对象包括 列表,字典,集合,图形对象等
不可变对象包括 字符串,整数,浮点数等
注意:变量本身不能被函数改变
所以对于不可变对象如字符串,当值改变时,标识符指向新值,旧值在程序空闲时自动被垃圾回收。
对于可变对象如列表,它的内存地址不变,只是内容被写入了新值,旧值会被垃圾回收
当函数中传值时:
1.赋值
- 实参,形参将会指向同一内存地址
2.修改形参
- 若为不可变对象,形参指向新的内存地址,实参不变(因为函数中是对形参操作)
- 若为可变对象,则内容写入新值
当要更改 不可变对象 时,一个明显的替代是让函数返回值来更新不可变对象。