关于Python功能及其工作原理的一些问题

关于Python功能及其工作原理的一些问题,python,Python,我编写以下程序来了解函数在Python中是如何工作的 def mylove(a): a=a+1 a=2 mylove(a) print(a) 当我打印(a)时,为什么它是2而不是3 另一方面,对于以下代码 def puzzle(name): name.pop() name=['s','s','s'] puzzle(name) print(name) 我们得到的结果是['s','s']整数是不可变的数据类型,因此它们不能更改 线路 a+=1 这是一条捷径 a=a+1

我编写以下程序来了解函数在Python中是如何工作的

def mylove(a):
    a=a+1
a=2
mylove(a)
print(a)
当我打印(a)时,为什么它是2而不是3


另一方面,对于以下代码

def puzzle(name):   
    name.pop()

name=['s','s','s']
puzzle(name)
print(name)

我们得到的结果是['s','s']

整数是不可变的数据类型,因此它们不能更改

线路

a+=1
这是一条捷径

a=a+1
发生的情况是,在函数范围内,变量标签“a”被分配给一个新的不同整数,而作为内存中对象的原始整数保持不变

在函数外部,标签“a”仍然指向原始的未更改整数对象

id()函数可用于显示两个变量的基础内存对象是否相同

>a=1
>>>定义f(a):
...  打印('before',id(a))
...  a+=1
...  打印('after',id(a))
...
>>>打印(“外部”,id(a));f(a);打印('外部',id(a))
外部504120010720
5041120010720之前
504120010752之后
外部504120010720
>>>
after对象与其他三个对象不同

相反,可以使用列表之类的可变内容来发送函数的更改

>b=[]
>>>def g(b):
...  打印('before',id(b))
...  b、 附加(5)
...  打印('after',id(b))
...
>>>打印(“外部”,id(b));g(b);打印(“外部”,id(b))
外部504083879680
504083879680之前
504083879680之后
外部504083879680
>>>印刷品(b)
[5]
after对象与其他三个对象是同一个对象

底线是append()修改内存中的同一对象,只允许对可变对象进行修改


Doin a+=不修改原始对象,而是生成一个分配给变量名的全新对象。

因为在函数内部,
a
指的是函数参数,而不是全局变量
a
。因此,增加参数的值,然后退出函数,失去该值,全局
a
仍然是
2
。一个好的编辑器或IDE(如VSCode或PyCharm)会警告您,当您重用外部作用域中的名称时,这称为阴影。您没有从函数返回
A
。如果有,您仍然需要重新分配它