欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.可变对象包括 列表,字典,集合,图形对象等
不可变对象包括 字符串,整数,浮点数等

注意:变量本身不能被函数改变

所以对于不可变对象如字符串,当值改变时,标识符指向新值,旧值在程序空闲时自动被垃圾回收。
对于可变对象如列表,它的内存地址不变,只是内容被写入了新值,旧值会被垃圾回收

python学习入门番外1 变量与对象,函数传值问题 2018.8.18

当函数中传值时:
1.赋值

  • 实参,形参将会指向同一内存地址

2.修改形参

  • 若为不可变对象,形参指向新的内存地址,实参不变(因为函数中是对形参操作)
  • 若为可变对象,则内容写入新值
当要更改 不可变对象 时,一个明显的替代是让函数返回值来更新不可变对象。