关于Python功能及其工作原理的一些问题
我编写以下程序来了解函数在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
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
。如果有,您仍然需要重新分配它