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
发生的事情是在函数范围内,变量标签“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() 修改内存中的同一个对象,只允许对可变对象进行修改。
执行 += 不会修改原始对象,但会生成一个全新的对象,该对象分配给变量名。
推荐阅读
- php - 如何在 cakePHP 4 中更改默认身份验证表名称“用户”?
- gitlab - 在 Gitlab Windows Runners 中无法识别 Terraform 命令
- pandas - Using .loc and shift() to add one to a serialnumber
- python - 在定义训练和测试 nn 之前在 Pytorch 中定义我的数据集
- react-native - 状态变量数组中的值为 boolean true 但是当迭代 state 变量的每个元素时,该值为 boolean false
- python - 如何在熊猫数据框中创建新列
- python - 如何运行使用python编译的C
- docker - 请求不会发送到 docker compose 中的 ngnix 反向代理
- node.js - Yarn 无法执行 source 命令
- c++ - 从用户那里获取输入