那些年在python中踩过的坑:调用方法时,对变量参数的修改问题

最近用python做题,因为对python的机制了解甚浅而踩了不少坑,关于方法中修改变量值的问题,吃亏很多次后终于懂了一丢丢,应该属于入门级的低端错误555555~仅记录一些自己不成熟的理解。

之前和同学开玩笑的时候说,python里面没有指针这个名词了,因为全都是指针。在调用方法的时候也要记得,传递的参数实际上是指向一个已经存在的对象,因此在子方法中操作变量时,也要根据它“指向的对象”来判断修改情况。

比如一个非常简单的例子:

def add(a):
    a += 1
    

a = 1

add(a)

a
Out[43]: 1

这个例子中的int值a可以换成字符串类型,会得到相同的结果,即无法在子方法外改变变量的值,要获取这个值我们就只能通过子方法的返回值,用一个变量来接住这个值(或者用全局变量)。为什么会这样呢,我们来看int型变量a在自增1之前的id变化:

a = 1

id(a)
Out[52]: 1690510000

a += 1 

id(a)
Out[54]: 1690510032

当a被自增时,它的id是变化的,也就是说,在子方法中我们实际上是用“a”这个名字覆盖了另一个值,这个值是原来a自增1的结果,但是子方法外的那个“a”,它的值变化了吗?并没有。有点类似于局部变量的意思。

字符串同理。

对于列表,它本身是可以进行原地修改的,我们就会看到:

def add(a):
    a[0] = 0
    

a = [1,2,3]

add(a)

a
Out[62]: [0, 2, 3]

显而易见地,我们有:

a = [1,2,3]

id(a)
Out[64]: 2435253695048

a[0] = 0

id(a)
Out[66]: 2435253695048

在子方法中,对列表进行任意形式切片操作或append、extend、insert,都是可以不借助返回值直接修改变量元素的,这其中的原因就是其“原地操作”的性质。而字符串是不可变数据类型,当我们写下a = "abc" a += "a" 这样的句子时,实际上是用一个新的地址覆盖了原来的。

对于列表,还有一个点,就是 += 这个操作。我们需要区别a = a + b 和 a += b。

a = a + b 式操作:

a = [1,2,3]

id(a)
Out[78]: 2435253692936

a = a + [0]

a
Out[80]: [1, 2, 3, 0]

id(a)
Out[81]: 2435252828808

a += b 式操作:

a = [1,2,3]

id(a)
Out[83]: 2435253690888

a += [0]

a
Out[85]: [1, 2, 3, 0]

id(a)
Out[86]: 2435253690888

容易看出,对于list(也许还有别的什么数据结构),+=是一个原地操作运算符,就是说在方法中可以通过+=修改列表元素。

最后皮一下:

def add(a):
    a = a + [0]
    a += [0]
    

a = [1,2,3]

add(a)

a
Out[90]: [1, 2, 3]

a的值是不变的,这一点虽然现在看起来显而易见,但是第一次我写出这种函数的时候真是百思不得其解,+=不是可以原地操作的吗?为什么我一直改不了数据?(ˉ▽ˉ;)...当时还调了大半天。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python ,可以在定义函数指定一个或多个参数。如果你想在函数使用已有的变量,可以将其传递给函数作为参数。例如: ``` def my_function(my_variable): print("The value of my_variable is:", my_variable) # 调用函数并传递变量作为参数 my_variable = 42 my_function(my_variable) ``` 在上面的示例,我们定义了一个名为 `my_function` 的函数,该函数接受一个名为 `my_variable` 的参数。我们然后将一个名为 `my_variable` 的变量设置为整数值 `42`,并将其作为参数传递给 `my_function`。函数将打印出 `The value of my_variable is: 42`。 在函数定义,你还可以提供默认参数值,这样在调用函数可以省略这些参数。例如: ``` def my_function(my_variable, my_default_variable=10): print("The value of my_variable is:", my_variable) print("The value of my_default_variable is:", my_default_variable) # 调用函数并传递一个参数 my_variable = 42 my_function(my_variable) # 调用函数并传递两个参数 my_variable = 42 my_default_variable = 20 my_function(my_variable, my_default_variable) ``` 在上面的示例,我们定义了一个名为 `my_function` 的函数,该函数接受两个参数 `my_variable` 和 `my_default_variable`。`my_default_variable` 参数设置了一个默认值 `10`。我们首先调用 `my_function` 并传递变量 `my_variable` 作为参数。该函数将打印出 `The value of my_variable is: 42` 和 `The value of my_default_variable is: 10`。然后我们调用 `my_function` 并传递变量 `my_variable` 和 `my_default_variable` 作为参数。该函数将打印出 `The value of my_variable is: 42` 和 `The value of my_default_variable is: 20`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值