首页 > 解决方案 > 关于 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']

标签: python

解决方案


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

线

a +=1

是一个捷径

a=a+1

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

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

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

>>> a =1
>>> def f(a):
...  print('before',id(a))
...  a+=1
...  print('after',id(a))
...
>>> print('outside',id(a));f(a);print('outside',id(a))
outside 504120010720
before 504120010720
after 504120010752
outside 504120010720
>>>

after 对象是与其他三个不同的对象。

相反,诸如列表之类的可变事物可用于将更改发送到函数之外。

>>> b=[]
>>> def g(b):
...  print('before',id(b))
...  b.append(5)
...  print('after',id(b))
...
>>> print('outside',id(b));g(b);print('outside',id(b))
outside 504083879680
before 504083879680
after 504083879680
outside 504083879680
>>> print(b)
[5]

after 对象与其他三个对象是相同的对象。

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

执行 += 不会修改原始对象,但会生成一个全新的对象,该对象分配给变量名。


推荐阅读