美文网首页
python参数传递

python参数传递

作者: D_w | 来源:发表于2021-11-18 10:42 被阅读0次

先以C++代码为例看看值传递,

#include <iostream>
using namespace std;
 
// 交换2个变量的值
void swap(int x, int y) {
int temp;
temp = x; // 交换x和y的值
 x = y;
 y = temp;
 return;
}
int main () {
 int a = 1;
 int b = 2;
 cout << "Before swap, value of a :" << a << endl;
 cout << "Before swap, value of b :" << b << endl;
 swap(a, b); 
 cout << "After swap, value of a :" << a << endl;
 cout << "After swap, value of b :" << b << endl;
 return 0;
}
-----------------输出------------------
Before swap, value of a :1
Before swap, value of b :2
After swap, value of a :1
After swap, value of b :2

这里的 swap() 函数,把 a 和 b 的值拷贝给了 x 和 y,然后再交换 x 和 y 的值。这样一来,x 和 y 的值发生了改变,但是 a 和 b 不受其影响,所以值不变。这种方式,就是我们所说的值传递。
若把上述例子中的swap()函数改为传递引用类型,则变为引用传递,所谓引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址。如果改变了其中任何一个变量的值,那么另外一个变量也会相应地随之改变。

void swap(int& x, int& y) {
   int temp;
   temp = x; // 交换x和y的值
   x = y;
   y = temp;
   return;
}
--------------------输出----------------
Before swap, value of a :1
Before swap, value of b :2
After swap, value of a :2
After swap, value of b :1

python变量赋值

  • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
  • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。
l1 = [1, 2, 3]
l2 = l1
l1.append(4)
l1
[1, 2, 3, 4]
l2
[1, 2, 3, 4]
  • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。
a = 1
b = a
a = a + 1
print(a)
print(b)
-----------------输出-------------
2
1
  • 变量可以被删除,但是对象无法被删除。

python函数的参数传递

Python 的参数传递是赋值传递 (pass by assignment),或者叫作对象的引用传递(pass by object reference)。Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说,注意的是,这里的赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。比如,我们来看下面这个例子:

def my_func3(l2):
  l2.append(4)

l1 = [1, 2, 3]
my_func3(l1)
l1
---------输出----------
[1, 2, 3, 4]

这个例子中,l1和l2都指向 [1, 2, 3],而这个列表可变,执行append后l1和l2的值都发生变化。再看下面的例子,l1的值没有改变

def my_func4(l2):
  l2 = l2 + [4]      # 创建了一个“末尾加入元素 4“的新列表,并让 l2 指向这个新的对象,此过程与l1无关

l1 = [1, 2, 3]
my_func4(l1)
l1
-----------输出-----------
[1, 2, 3]

上面的例子想要l1有所变化,就需要让my_func4方法返回运行结果,再赋值给l1

def my_func5(l2):
  l2 = l2 + [4]
  return l2

l1 = [1, 2, 3]
l1 = my_func5(l1)
l1
[1, 2, 3, 4]

改变变量和重新赋值的区别:

  • my_func3() 中单纯地改变了对象的值,因此函数返回后,所有指向该对象的变量都会被改变;
  • 但 my_func4() 中则创建了新的对象,并赋值给一个本地变量,因此原变量仍然不变。
    还有一点需要注意,‘a = a + b’的意义仅是赋值操作,在a自身原有的值的基础上进行“+”操作,并不是在自身原来指向的对象上进行操作,无论对于不可变类型int, string, tuple来说,还是对于有序的可变类型list来说,此操作都会切断与原对象的联系,然后生成新的对象,具体体现在内存值发生变化。(set和dict不支持‘+’操作)。
    'a += b', '+='是拼接操作。对于不可变类型int, string, tuple来说,'a += b'可以看作是 'a = a + b',所以同上,会重新生成新的对象;而对于可变类型list来说,此语句等效于 a.append(b),因其可变,所以直接在原内存地址原对象上进行变化。set和dict均不支持此操作符。

相关文章

  • Python的参数传递

    Python的参数传递概述 根据Python的官方文档,Python中的参数传递机制是所谓的pass by ass...

  • 2021-09-10

    python调用shell脚本 1. 传入参数 python文件 可以套用python传递参数,二次传递给shel...

  • python脚本传递参数

    给python程序传递参数 运行python脚本时有时需要执行实传递参数 在linux下: [root@Test ...

  • 抓取解析接口的视频真实地址(五)

    php调用python并传递参数

  • Python 函数的参数传递\*args和\**kwargs

    Python 函数的参数传递*args和**kwargs 参数传递机制具有值传递(int、float等值数据类型)...

  • Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的。通过学习《Python函数值传递和引用传...

  • python参数

    python中参数传递有顺序传递,关键词传递,默认参数和不定长参数四种形式 顺序传递 顺序传递就是按照形参的顺序依...

  • python的参数传递

    一、前言 在python中,函数参数的定义和传递有以下几种方式: 在python中,参数可以按照顺序传递,在调用函...

  • python参数传递

    看两个例子: a = 1 def fun(a): a= 2 fun(a) print(a) # 1 a = [...

  • python 传递参数

    返回结果 显然python传参数的方式是传引用。 不可变对象 对于不可变对象,你在函数内做什么都不会改变外面的结果...

网友评论

      本文标题:python参数传递

      本文链接:https://www.haomeiwen.com/subject/bsrdtrtx.html